Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
Va kalit bo'yicha qiymatlarni qanday olish mumkin:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
Agar yuqorida aytilganlarning barchasi aniq bo'lsa, keling, mashhur savollarga javoblarimizga o'tamiz!
0. Barcha Xarita qiymatlari orqali qanday takrorlash mumkin
Qiymatlarni takrorlash xaritalar bilan bajaradigan eng keng tarqalgan operatsiya hisoblanadi. Barcha kalit-qiymat juftlari Map.Entry ichki interfeysida saqlanadi va ularni olish uchun sizentrySet()
. U o'tish mumkin bo'lgan juftliklar to'plamini qaytaradi:
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. Xaritani roʻyxatga qanday aylantirish mumkin
Xarita interfeysida elementlar ro'yxatini qaytaradigan 3 ta usul mavjud:- keySet() - tugmalar to'plamini qaytaradi;
- values() - qiymatlar to'plamini qaytaradi;
- entrySet() - kalit-qiymatlar to'plamini qaytaradi.
ArrayList
, Collection tipidagi argumentga ega konstruktor mavjudligini ko'rasiz. Set Collectionning avlodi bo'lganligi sababli, yuqoridagi barcha usullarning natijalari sinf konstruktoriga o'tkazilishi mumkin ArrayList
. Shunday qilib, biz yangi ro'yxatlarni yaratamiz va ularni quyidagi qiymatlar bilan to'ldiramiz 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. Xarita tugmachalarini saralash
Xaritalarni saralash ham dasturlashda juda keng tarqalgan operatsiya hisoblanadi. Buni bir necha usulda qilishingiz mumkin:-
Map.Entry ni roʻyxatga qoʻying va uni Comparator yordamida tartiblang .
Taqqoslovchida biz faqat juftlik kalitlarini solishtiramiz:
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(); } }); Agar siz lambdalarni tushunsangiz, bu yozuvni sezilarli darajada qisqartirish mumkin:
Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
-
dan foydalaning
SortedMap
, aniqrog'i,TreeMap
uning konstruktorida Comparatorni qabul qiluvchi uni amalga oshirish. Ushbu taqqoslagich xarita tugmachalariga qo'llaniladi, shuning uchun kalitlar interfeysni amalga oshiradigan sinflar bo'lishi kerakComparable
:SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
Va, albatta, lambdalar yordamida hamma narsani qayta yozish mumkin:
SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));
Birinchi usuldan farqli o'laroq, SortedMap-dan foydalanib, biz har doim ma'lumotlarni tartiblangan shaklda saqlaymiz.
3. Xarita qiymatlarini saralash
Bu erda siz kalitlar uchun birinchisiga o'xshash yondashuvdan foydalanishingiz kerak - qiymatlar ro'yxatini oling va ularni ro'yxatda tartiblang: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());
}
});
Va buning uchun lambda quyidagicha ko'rinadi:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));
4. HashMap, TreeMap va Hashtable o'rtasidagi farq nima
Yuqorida aytib o'tilganidek, Map interfeysining 3 ta asosiy ilovasi mavjud. Ularning har biri o'ziga xos xususiyatlarga ega:-
Elementlarning tartibi.
HashMap
vaHashtable
elementlar qo'shilgan tartibda saqlanishiga kafolat bermang. Bundan tashqari, ular vaqt o'tishi bilan elementlarning tartibi o'zgarmasligiga kafolat bermaydi. O'z navbatida,TreeMap
u elementlarni qo'shilgan tartibda yoki berilgan taqqoslagichga muvofiq saqlashni kafolatlaydi. -
Yaroqli qiymatlar.
HashMap
kalit va null qiymatga ega bo'lish imkonini beradi,HashTable
yo'q. TreeMap null qiymatlardan faqat solishtiruvchi ruxsat bergan taqdirdagina foydalanishi mumkin. Taqqoslovchidan foydalanmasdan (juftlarni qo'shilgan tartibda saqlash orqali) nullga ruxsat berilmaydi. -
Sinxronizatsiya. Faqat
HashTable
sinxronlashtiriladi, qolganlari yo'q. Agar xaritaga turli mavzular orqali kirish imkoni bo'lmasa, HashTable o'rniga HashMap dan foydalanish tavsiya etiladi.
HashMap | HashTable | TreeMap | |
---|---|---|---|
Elementlarning tartibi | Yo'q | Yo'q | Ha |
qiymat sifatida null | Ha | Yo'q | Ha yoq |
Ip xavfsizligi | Yo'q | Ha | Yo'q |
Elementlarni qidirishning algoritmik murakkabligi | O(1) | O(1) | O(log n) |
Kaput ostidagi ma'lumotlar tuzilishi | hash jadvali | hash jadvali | qizil-qora daraxt |
5. Ikki tomonlama xarita qanday tuziladi
Ba'zan kalitlar va qiymatlar noyob bo'lgan ma'lumotlar tuzilmasidan foydalanish kerak bo'ladi, ya'ni xaritada kalit-kalit juftlari mavjud. Ushbu ma'lumotlar strukturasi xaritada "teskari ko'rinish/qidiruv" yaratish imkonini beradi. Ya'ni, biz kalitni uning qiymati bo'yicha topishimiz mumkin.Bu ma'lumotlar strukturasi ikki tomonlama xarita deb ataladi, afsuski, JDK tomonidan qo'llab-quvvatlanmaydi. Ammo, xayriyatki, uni amalga oshirishni Apache Common Collections yoki Guava kutubxonalarida topish mumkin. U erda mos ravishda BidiMap va BiMap deb ataladi. Ushbu ilovalar kalitlar va qiymatlarning o'ziga xosligiga cheklovlar qo'yadi. Bu yakkama-yakka munosabatlarni yaratadi.6. Bo'sh Xarita qanday yaratiladi
Bo'sh xaritani yaratishning ikki yo'li mavjud:-
Oddiy ob'ektni ishga tushirish:
Map<Integer, String> emptyMap = new HashMap<>();
-
O'zgarmas bo'sh xaritani yaratish:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
istisno. Ushbu maqolada biz Xarita interfeysidan foydalanishda paydo bo'lishi mumkin bo'lgan eng keng tarqalgan savollarni ko'rib chiqdik.
Yana nimani o'qish kerak: |
---|
GO TO FULL VERSION