JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ نقشي بابت مٿي 9 سوال
Treefeed
سطح

جاوا ۾ نقشي بابت مٿي 9 سوال

گروپ ۾ شايع ٿيل
ياد رهي ته هڪ نقشو منظم ڪيل ڊيٽا آهي جنهن ۾ ڪيئي-قدر جوڑوں جي هڪ سيٽ تي مشتمل آهي، ۽ هر ڪيچي صرف هڪ ڀيرو هڪ نقشي ۾ استعمال ڪري سگهجي ٿي. هي موضوع 9 بنيادي سوالن جو احاطو ڪري ٿو جاوا ۾ نقشو استعمال ڪرڻ ۽ ان تي لاڳو ڪيل ڪلاسن بابت. سادگي لاءِ، مان مثالن ۾ عام استعمال ڪندس . تنهن ڪري، مان صرف Map لکندس، نقشي جي وضاحت ڪندڙ کي بيان ڪرڻ کان سواء. پر توهان فرض ڪري سگهو ٿا ته K ۽ V جي ٻنهي قدرن جو مقابلو آهي، جنهن جو مطلب آهي K وڌائي ٿو تقابلي ۽ V پڻ وڌائي ٿو موازنہ .جاوا ۾ نقشي بابت مٿيان 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 ، جيڪو اضافي طور تي، ان جي ڪنجين کي ترتيب سان ترتيب ڏئي ٿو. پر، سڀني ڪنجين کي لازمي طور تي تقليد ڪرڻ گهرجي يا موازنہ ڪندڙ طرفان قبول ڪيو وڃي. لاڳو ڪيل طبقن مان هڪ SortedMapآهي TreeMap . ان جو ٺاھيندڙ ھڪڙو موازنہ قبول ڪري ٿو. ھيٺ ڏنل ڪوڊ ڏيکاري ٿو ته ڪيئن ھڪڙي عام ھڪڙي کي 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");. تنهن ڪري اهو حقيقي ناقابل تبديلي نه آهي. جامد شروعات ڪندڙ کي استعمال ڪندي هڪ ناقابل بدلي نقشو ٺاهڻ لاءِ، اسان کي هڪ سپر گمنام ڪلاس جي ضرورت آهي، جنهن کي اسين آخري شروعاتي قدم تي ناقابل بدلائي نقشي ۾ شامل ڪنداسين. مهرباني ڪري ڪوڊ جو ٻيو حصو ڏسو. جڏهن هڪ UnsupportedOperationException اڇلايو ويندو جيڪڏهن توهان هلائيندا آهيو Test.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);
  }
}
گووا لائبريري جامد ۽ غير تبديل ٿيندڙ مجموعن کي شروع ڪرڻ لاءِ مختلف طريقن سان پڻ مدد ڪري ٿي. گووا جي ناقابل تبديلي ڪليڪشن يوٽيلٽي جي فائدن جي باري ۾ وڌيڪ ڄاڻڻ لاءِ، ڏسو Immutable Collections سيڪشن ۾ Guava How-to .

5. HashMap، TreeMap، ۽ Hashtable جي وچ ۾ فرق

جاوا ۾ نقشي جي انٽرفيس جا ٽي مکيه عمل آھن : HashMap ، TreeMap ، ۽ Hashtable . مکيه اختلاف هن ريت آهن:
  • گذرڻ جو حڪم . HashMap ۽ HashTable نقشي جي ترتيب جي ضمانت نه ڏيندا آھن؛ خاص طور تي، اهي ضمانت نه ڏيندا آهن ته آرڊر ساڳئي وقت تي رهندو. پر TreeMapاهو سڀني قدرن کي ڪنجين جي "قدرتي ترتيب" ۾ يا هڪ موازنہ ڪندڙ طرفان ترتيب ڏيندو.
  • صحيح اهم-قدر جوڙو. HashMapتوهان کي null key ۽ null value حاصل ڪرڻ جي اجازت ڏئي ٿي. HashTablenull key يا null value جي اجازت نٿو ڏئي. جيڪڏهن TreeMapقدرتي ترتيب استعمال ڪئي وئي آهي يا موازنہ ڪندڙ هڪ null چاٻي جي اجازت نٿو ڏئي، هڪ استثنا اڇلايو ويندو.
  • هم وقت سازي . صرف هم HashTableوقت سازي، باقي نه آهن. پر، "جيڪڏهن هڪ سلسلي-محفوظ عمل جي ضرورت نه آهي، اهو استعمال ڪرڻ جي سفارش ڪئي وئي آهي " HashMapبدران HashTable.
وڌيڪ تفصيلي مقابلو
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
HashMap بمقابله تعلق بابت وڌيڪ پڙهو . TreeMap vs. هيش ٽيبل بمقابلہ LinkedHashMap _

6. ريورس ڳولها/ڏسڻ سان نقشو

ڪڏهن ڪڏهن، اسان کي هڪ سيٽ جي ضرورت هوندي آهي ڪيئي-چين جوڙن جو، جنهن جو مطلب آهي قدرن وانگر منفرد آهن ڪنجيون (هڪ هڪ کان هڪ نمونو). هي مستقل مزاجي توهان کي نقشي تي ”انٽٽ ٿيل ڏيک/سرچ“ ٺاهڻ جي اجازت ڏئي ٿي. اهو آهي، اسان ان جي قيمت ذريعي هڪ چاٻي ڳولي سگهون ٿا. هن ڊيٽا جي جوڙجڪ کي هڪ طرفي نقشو سڏيو ويندو آهي ، جيڪو بدقسمتي سان JDK پاران سهڪار نه آهي. ٻئي Apache Common Collections ۽ 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