JavaRush /جاوا بلاگ /Random-UR /نقشہ انٹرفیس کے بارے میں سب سے زیادہ مقبول سوالات کے جواب...

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

گروپ میں شائع ہوا۔
ہیلو! آج ہم نقشہ کے بارے میں سب سے عام سوالات کے جوابات دیں گے، لیکن پہلے، یاد رکھیں کہ یہ کیا ہے۔ نقشہ انٹرفیس کے بارے میں سب سے زیادہ مقبول سوالات کے جوابات - 1نقشہ ایک ڈیٹا ڈھانچہ ہے جس میں کلیدی قدر کے جوڑوں کا ایک سیٹ ہوتا ہے۔ اس کا ڈیٹا ڈھانچہ لغت سے ملتا جلتا ہے، اسی لیے اسے اکثر کہا جاتا ہے۔ ایک ہی وقت میں، Map ایک انٹرفیس ہے ، اور معیاری jdk میں اس میں اہم نفاذات شامل ہیں: Hashmap، LinkedHashMap، Hashtable، TreeMap۔ سب سے زیادہ استعمال ہونے والا عمل Hashmap ہے، لہذا ہم اسے اپنی مثالوں میں استعمال کریں گے۔ نقشہ کی معیاری تخلیق اور بھرائی اس طرح دکھائی دیتی ہے:
Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
اور کلید کے ذریعہ اقدار حاصل کرنے کا طریقہ یہ ہے:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
اگر اوپر کی تمام باتیں واضح ہیں، تو آئیے مقبول سوالات کے اپنے جوابات پر آگے بڑھتے ہیں!

0. نقشہ کی تمام اقدار کے ذریعے اعادہ کیسے کریں۔

اقدار پر اعادہ کرنا سب سے عام آپریشن ہے جو آپ نقشوں کے ساتھ انجام دیتے ہیں۔ تمام کلیدی قدر کے جوڑے اندرونی Map.Entry انٹرفیس میں محفوظ ہیں، اور انہیں حاصل کرنے کے لیے آپ کو کال کرنے کی ضرورت ہے entrySet()۔ یہ جوڑوں کا ایک سیٹ لوٹاتا ہے جس کے ذریعے لوپ کیا جاسکتا ہے:
for(Map.Entry<Integer, String> entry: map.entrySet()) {
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
   Map.Entry<Integer, String> entry =  itr.next();
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

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

نقشہ انٹرفیس میں 3 طریقے ہیں جو عناصر کی فہرست واپس کرتے ہیں:
  • keySet() - چابیاں کا ایک سیٹ لوٹاتا ہے۔
  • values() - اقدار کا مجموعہ لوٹاتا ہے۔
  • entrySet() - کلیدی قدر کے سیٹ کا ایک سیٹ لوٹاتا ہے۔
اگر آپ کلاس کے کنسٹرکٹرز کو دیکھیں گے ArrayList، تو آپ دیکھیں گے کہ ایک کنسٹرکٹر موجود ہے جس میں قسم کلیکشن کی دلیل ہے۔ چونکہ سیٹ مجموعہ کی اولاد ہے، اس لیے مذکورہ بالا تمام طریقوں کے نتائج کلاس کے کنسٹرکٹر کو بھیجے جا سکتے ہیں ArrayList۔ لہذا ہم نئی فہرستیں بنائیں گے اور ان کو درج ذیل اقدار سے پُر کریں گے Map۔
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());

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

نقشوں کو چھانٹنا بھی پروگرامنگ میں کافی عام کام ہے۔ آپ اسے کئی طریقوں سے کر سکتے ہیں:
  1. Map.Entry کو فہرست میں ڈالیں اور Comparator کا استعمال کرتے ہوئے اسے ترتیب دیں ۔

    موازنہ کرنے والے میں ہم صرف جوڑوں کی چابیاں کا موازنہ کریں گے:

    List> list = new ArrayList(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
       @Override
       public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
           return o1.getKey() - o2.getKey();
       }
    });
    

    اگر آپ لیمبڈاس کو سمجھتے ہیں، تو اس اندراج کو نمایاں طور پر مختصر کیا جا سکتا ہے:

    Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
  2. استعمال کریں SortedMap، یا زیادہ واضح طور پر، اس کا نفاذ TreeMap، جو اپنے کنسٹرکٹر میں Comparator کو لیتا ہے۔ یہ موازنہ نقشہ کی چابیاں پر لاگو کیا جائے گا، لہذا چابیاں ایسی کلاسیں ہونی چاہئیں جو انٹرفیس کو نافذ کرتی ہیں Comparable:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           return o1 - o2;
       }
    });

    اور، یقینا، ہر چیز کو lambdas کا استعمال کرتے ہوئے دوبارہ لکھا جا سکتا ہے:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));

    پہلے طریقہ کے برعکس، SortedMap کا استعمال کرتے ہوئے، ہم ہمیشہ ڈیٹا کو ترتیب شدہ شکل میں ذخیرہ کریں گے۔

3. نقشے کی قدروں کو کیسے ترتیب دیا جائے۔

یہاں آپ کو چابیاں کے لیے پہلے کی طرح کا طریقہ استعمال کرنا چاہیے - اقدار کی فہرست حاصل کریں اور فہرست میں ترتیب دیں:
List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
   @Override
   public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
       return o1.getValue().compareTo(o2.getValue());
   }
});
اور اس کے لیے لیمبڈا اس طرح لگتا ہے:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));

4. HashMap، TreeMap، اور Hashtable میں کیا فرق ہے۔

جیسا کہ پہلے ذکر کیا گیا ہے، نقشہ انٹرفیس کے 3 اہم نفاذ ہیں۔ ان میں سے ہر ایک کی اپنی خصوصیات ہیں:
  1. عناصر کی ترتیب۔ HashMapاور Hashtableاس بات کی ضمانت نہیں دیتے کہ اشیاء کو اسی ترتیب میں ذخیرہ کیا جائے گا جسے وہ شامل کیا گیا تھا۔ اس کے علاوہ، وہ اس بات کی ضمانت نہیں دیتے کہ عناصر کی ترتیب وقت کے ساتھ تبدیل نہیں ہوگی۔ بدلے میں، TreeMapیہ عناصر کو اس ترتیب میں ذخیرہ کرنے کی ضمانت دیتا ہے جس ترتیب سے وہ شامل کیے گئے تھے یا دیئے گئے موازنہ کے مطابق۔

  2. درست اقدار۔ HashMapآپ کو ایک کلید اور ایک کالعدم قدر رکھنے کی اجازت دیتا ہے، HashTableنہیں۔ TreeMap صرف null اقدار کا استعمال کر سکتا ہے اگر موازنہ کرنے والا اس کی اجازت دیتا ہے۔ موازنہ کرنے والے کا استعمال کیے بغیر (جوڑوں کو اس ترتیب میں ذخیرہ کرکے جو وہ شامل کیے گئے تھے)، null کی اجازت نہیں ہے۔

  3. ہم وقت سازی صرف HashTableمطابقت پذیر ہے، باقی نہیں ہیں. اگر مختلف تھریڈز کے ذریعے نقشہ تک رسائی حاصل نہیں کی جائے گی، تو HashTable کے بجائے HashMap استعمال کرنے کی سفارش کی جاتی ہے۔

اور نفاذ کا عمومی موازنہ:
ہیش میپ ہیش ٹیبل ٹری میپ
عناصر کی ترتیب نہیں نہیں جی ہاں
قدر کے طور پر null جی ہاں نہیں واقعی نہیں۔
دھاگے کی حفاظت نہیں جی ہاں نہیں
عناصر کی تلاش کی الگورتھمک پیچیدگی O(1) O(1) O(log n)
ہڈ کے نیچے ڈیٹا کا ڈھانچہ ہیش ٹیبل ہیش ٹیبل سرخ سیاہ درخت

5. دو طرفہ نقشہ کیسے بنایا جائے۔

بعض اوقات ایسا ڈیٹا ڈھانچہ استعمال کرنا ضروری ہو جاتا ہے جس میں کیز اور ویلیوز دونوں منفرد ہوں گے، یعنی نقشے میں کلید کے جوڑے ہوں گے۔ یہ ڈیٹا ڈھانچہ آپ کو نقشے پر ایک "الٹی ​​منظر/تلاش" بنانے کی اجازت دیتا ہے۔ یعنی، ہم ایک کلید کو اس کی قدر سے تلاش کر سکتے ہیں۔ ڈیٹا کے اس ڈھانچے کو دو طرفہ نقشہ کہا جاتا ہے، جو بدقسمتی سے JDK سے تعاون یافتہ نہیں ہے۔ لیکن، خوش قسمتی سے، اس کا نفاذ اپاچی کامن کلیکشنز یا امرود کی لائبریریوں میں پایا جا سکتا ہے۔ وہاں اسے بالترتیب BidiMap اور BiMap کہا جاتا ہے۔ یہ نفاذ چابیاں اور اقدار کی انفرادیت پر پابندیاں عائد کرتے ہیں۔ اس سے ون ٹو ون تعلق پیدا ہوتا ہے۔

6. خالی نقشہ کیسے بنایا جائے۔

خالی نقشہ بنانے کے دو طریقے ہیں:
  1. عام آبجیکٹ کا آغاز:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. ایک ناقابل تبدیل خالی نقشہ بنانا:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
جب ہم اس طرح کے نقشے میں ڈیٹا شامل کرنے کی کوشش کرتے ہیں، تو ہمیں موصول ہوگا: UnsupportedOperationExceptionاستثناء۔ اس مضمون میں، ہم نے سب سے عام سوالات کو دیکھا جو آپ کو نقشہ انٹرفیس استعمال کرتے وقت ہو سکتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION