JavaRush /جاوا بلاگ /Random-UR /جاوا میں نقشے کے بارے میں سرفہرست 9 سوالات
Treefeed
سطح

جاوا میں نقشے کے بارے میں سرفہرست 9 سوالات

گروپ میں شائع ہوا۔
یاد رکھیں کہ نقشہ ایک منظم ڈیٹا ہوتا ہے جس میں کلیدی قدر کے جوڑوں کے سیٹ پر مشتمل ہوتا ہے، اور ہر کلید کو ایک نقشہ میں صرف ایک بار استعمال کیا جا سکتا ہے۔ یہ موضوع جاوا میں نقشہ کے استعمال اور اس کی نافذ کردہ کلاسوں کے بارے میں 9 بنیادی سوالات کا احاطہ کرتا ہے۔ سادگی کے لیے، میں مثالوں میں عمومی استعمال کروں گا ۔ اس لیے، میں Map specifier کی وضاحت کیے بغیر صرف Map لکھوں گا۔ لیکن آپ فرض کر سکتے ہیں کہ K اور V کی دونوں قدریں موازنہ ہیں، جس کا مطلب ہے K توسیع کرتا ہے Comparable اور V بھی توسیع کرتا ہے Comparable ۔جاوا میں نقشے کے بارے میں سرفہرست 9 سوالات - 1

0. نقشے کو فہرست میں تبدیل کرنا

جاوا میں، نقشہ انٹرفیس تین قسم کے مجموعے پیش کرتا ہے: ایک کلیدی سیٹ، ایک ویلیو سیٹ، اور ایک کلیدی ویلیو سیٹ۔ ان سب کو کنسٹرکٹر یا طریقہ استعمال کرکے ایک فہرستaddAll() میں تبدیل کیا جاسکتا ہے ۔ درج ذیل کوڈ کا ٹکڑا نقشہ سے ArrayList بنانے کا طریقہ دکھاتا ہے۔
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());

1. نقشہ میں تمام اقدار کو لوپ کریں۔

ہر کلیدی قدر کے جوڑے کے ذریعے چلنا نقشہ کے ذریعے چلنے کا سب سے بنیادی، بنیادی طریقہ کار ہے۔ جاوا میں، ہر جوڑا Map.Entry نامی ایک میپ فیلڈ میں محفوظ کیا جاتا ہے ۔ Map.entrySet()کلیدی اقدار کا ایک سیٹ لوٹاتا ہے، لہذا نقشہ کی تمام اقدار کے ذریعے اعادہ کرنے کا سب سے موثر طریقہ یہ ہوگا:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
ہم بھی استعمال کر سکتے ہیں Iterator، خاص طور پر JDK 1.5 سے چھوٹے ورژن میں
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
  Entry entry = itr.next();
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}

2. چابیاں کے ذریعہ نقشہ ترتیب دینا

کلیدوں کے ذریعے نقشوں کو ترتیب دینا ایک اور عام استعمال شدہ طریقہ کار ہے۔ پہلا طریقہ یہ ہے کہ Map.Entry کو فہرست میں شامل کریں، اور قدروں کے حساب سے ترتیب دینے والے موازنہ کا استعمال کرتے ہوئے ترتیب دیں۔
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getKey().compareTo(e2.getKey());
  }
});
دوسرا طریقہ: استعمال کریں SortedMap ، جو اس کے علاوہ، اپنی چابیاں بھی ترتیب سے ترتیب دیتا ہے۔ لیکن، تمام کلیدوں میں Comparable کو مجسم ہونا چاہیے یا comparator کے ذریعے قبول کیا جانا چاہیے۔ نافذ شدہ کلاسوں میں سے ایک TreeMapSortedMap ہے ۔ اس کا کنسٹرکٹر ایک موازنہ قبول کرتا ہے۔ درج ذیل کوڈ دکھاتا ہے کہ کس طرح ایک نارمل کو آرڈر شدہ میں تبدیل کیا جائے۔ Map
SortedMap sortedMap = new TreeMap(new Comparator() {

  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }

});
sortedMap.putAll(Map);

3. اقدار کے لحاظ سے نقشہ ترتیب دیں۔

فہرست میں نقشہ شامل کرنا اور پھر اسے چھانٹنا اس معاملے میں کام کرتا ہے، لیکن اس بار آپ کو استعمال کرنے کی ضرورت ہے Entry.getValue()۔ نیچے کا کوڈ تقریباً پہلے جیسا ہی ہے۔
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getValue().compareTo(e2.getValue());
  }

});
ہم اسے SortedMapاس معاملے میں اب بھی استعمال کر سکتے ہیں، لیکن صرف اس صورت میں جب اقدار منفرد ہوں۔ اس صورت میں، آپ کلیدی قدر کے جوڑے کو کلیدی قدر میں تبدیل کر سکتے ہیں۔ اس حل کی سخت حدود ہیں اور میرے ذریعہ اس کی سفارش نہیں کی جاتی ہے۔

4. ایک جامد/غیر تبدیل شدہ نقشہ شروع کرنا

جب آپ چاہتے ہیں کہ نقشہ ناقابل تغیر رہے، تو ایک اچھا طریقہ یہ ہے کہ اسے ناقابل تغیر نقشہ میں کاپی کریں۔ یہ دفاعی پروگرامنگ تکنیک آپ کو ایسا نقشہ بنانے میں مدد کرے گی جو نہ صرف استعمال میں محفوظ ہو بلکہ دھاگے سے بھی محفوظ ہو۔ ایک جامد/غیر تبدیل شدہ نقشہ کو شروع کرنے کے لیے، ہم ایک انیشیلائزر استعمال کر سکتے ہیں static(نیچے دیکھیں)۔ اس کوڈ کے ساتھ مسئلہ یہ ہے کہ اگرچہ نقشہ کو بطور قرار دیا گیا ہے static final، مثال کے طور پر ہم ابتدا کے بعد بھی اس کے ساتھ کام کر سکتے ہیں Test.Map.put(3,"three");۔ تو یہ حقیقی تغیر پذیری نہیں ہے۔ جامد انیشیلائزر کا استعمال کرتے ہوئے ایک ناقابل تغیر نقشہ بنانے کے لیے، ہمیں ایک انتہائی گمنام کلاس کی ضرورت ہے، جسے ہم آخری ابتدائی مرحلے پر ناقابل تغیر نقشہ میں شامل کریں گے۔ براہ کرم کوڈ کا دوسرا حصہ دیکھیں۔ جب آپ چلاتے ہیں تو ایک UnsupportedOperationExceptionTest.Map.put(3,"three"); پھینک دیا جائے گا ۔
public class Test {

  private static final Map Map;
  static {
    Map = new HashMap();
    Map.put(1, "one");
    Map.put(2, "two");
  }
}
public class Test {

  private static final Map Map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    Map = Collections.unmodifiableMap(aMap);
  }
}
امرود کی لائبریری جامد اور غیر تبدیل شدہ مجموعوں کو شروع کرنے کے مختلف طریقوں کی بھی حمایت کرتی ہے۔ امرود کی ناقابل تغیر جمع کرنے کی افادیت کے فوائد کے بارے میں مزید جاننے کے لیے، Guava How-to میں غیر منقولہ مجموعہ سیکشن دیکھیں ۔

5. HashMap، TreeMap، اور Hashtable کے درمیان فرق

جاوا میں میپ انٹرفیس کے تین اہم نفاذ ہیں : HashMap ، TreeMap ، اور Hashtable ۔ اہم اختلافات درج ذیل ہیں:
  • گزرنے کی ترتیب HashMap اور HashTable نقشے کی ترتیب کی ضمانت نہیں دیتے ہیں۔ خاص طور پر، وہ اس بات کی ضمانت نہیں دیتے ہیں کہ وقت کے ساتھ آرڈر ایک جیسا رہے گا۔ لیکن TreeMapیہ تمام اقدار کو چابیاں کے "قدرتی ترتیب" میں یا ایک موازنہ کرنے والے کے ذریعہ ترتیب دے گا۔
  • کلیدی قدر کے درست جوڑے۔ HashMapآپ کو ایک null کلید اور ایک null قدر رکھنے کی اجازت دیتا ہے۔ HashTablenull key یا null value کی اجازت نہیں دیتا۔ اگر TreeMapفطری ترتیب استعمال کی جاتی ہے یا موازنہ کنندہ null کلید کی اجازت نہیں دیتا ہے تو ایک استثناء دیا جائے گا۔
  • ہم وقت سازی صرف HashTableمطابقت پذیر ہے، باقی نہیں ہیں. لیکن، "اگر تھریڈ سے محفوظ نفاذ کی ضرورت نہیں ہے، تو اس HashMapکی بجائے " استعمال کرنے کی سفارش کی جاتی ہے HashTable۔
مزید تفصیلی موازنہ
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
HashMap بمقابلہ تعلقات کے بارے میں مزید پڑھیں ۔ TreeMap بمقابلہ ہیش ٹیبل بمقابلہ لنکڈ ہیش میپ

6. ریورس سرچ/ویو کے ساتھ نقشہ

بعض اوقات، ہمیں کلیدی کلید کے جوڑوں کے ایک سیٹ کی ضرورت ہوتی ہے، جس کا مطلب ہے کہ قدریں کلیدوں کی طرح منفرد ہوتی ہیں (ایک سے ایک پیٹرن)۔ یہ مستقل مزاجی آپ کو نقشے پر ایک "الٹی ​​منظر/تلاش" بنانے کی اجازت دیتی ہے۔ یعنی، ہم اس کی قیمت سے کلید تلاش کر سکتے ہیں۔ اس ڈیٹا ڈھانچے کو دو طرفہ نقشہ کہا جاتا ہے ، جو بدقسمتی سے JDK کے ذریعہ تعاون یافتہ نہیں ہے۔ Apache Common Collection اور Guava دونوں دو طرفہ نقشہ کے نفاذ کی پیشکش کرتے ہیں جسے بالترتیب BidiMap اور BiMap کہتے ہیں۔ دونوں ایک رکاوٹ متعارف کراتے ہیں جو کلیدوں اور اقدار کے درمیان 1:1 میپنگ کو نافذ کرتی ہے۔

7. نقشے کی اتلی کاپی

تقریباً سبھی، اگر سبھی نہیں، جاوا میں نقشے میں دوسرے نقشے کے لیے ایک کاپی کنسٹرکٹر ہوتا ہے۔ لیکن کاپی کرنے کا طریقہ کار مطابقت پذیر نہیں ہے۔ جس کا مطلب ہے کہ جب ایک دھاگہ نقشہ کو کاپی کرتا ہے تو دوسرا دھاگہ اس کی ساخت کو تبدیل کر سکتا ہے۔ اچانک کاپی ڈی سنکرونائزیشن کو روکنے کے لیے، ایسی صورت میں ان میں سے ایک کا استعمال کیا جانا چاہیے Collections.synchronizedMap()۔
Map copiedMap = Collections.synchronizedMap(Map);
اتلی کاپی کرنے کا ایک اور دلچسپ طریقہ استعمال کرنا ہے clone()۔ لیکن جاوا کلیکشن فریم ورک کے خالق جوشوا بلوچ نے بھی اس کی سفارش نہیں کی ہے۔ " کاپی کنسٹرکٹر بمقابلہ کلوننگ " بحث میں ، وہ یہ پوزیشن لیتا ہے: اقتباس: "میں اکثر کنکریٹ کلاسوں میں ایک عوامی کلون طریقہ فراہم کرتا ہوں کیونکہ لوگ ان سے وہاں ہونے کی توقع رکھتے ہیں۔ ... یہ شرم کی بات ہے کہ کلوننگ ٹوٹ گئی ہے، لیکن یہ کلوننگ ایک کمزور نقطہ ہے، اور میرے خیال میں لوگوں کو اس کی حدود کے بارے میں خبردار کیا جانا چاہیے۔" clone()اس وجہ سے، میں آپ کو نقشہ کاپی کرنے کا طریقہ استعمال کرنے کا طریقہ بھی نہیں دکھاتا ہوں۔

8. ایک خالی نقشہ بنائیں

اگر Mapناقابل تغیر ہو تو استعمال کریں:
Map = Collections.emptyMap();
یا، کوئی اور مجسم استعمال کریں۔ مثال کے طور پر:
Map = new HashMap();
END
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION