JavaRush /Java blogi /Random-UZ /Xarita interfeysi haqidagi eng mashhur savollarga javobla...

Xarita interfeysi haqidagi eng mashhur savollarga javoblar

Guruhda nashr etilgan
Salom! Bugun biz Xarita haqidagi eng keng tarqalgan savollarga javob beramiz, lekin avval bu nima ekanligini eslaylik. Xarita interfeysi haqidagi eng mashhur savollarga javoblar - 1Xarita - bu kalit-qiymat juftliklari to'plamini o'z ichiga olgan ma'lumotlar tuzilmasi. Uning ma'lumotlar strukturasi lug'atga o'xshaydi, shuning uchun uni ko'pincha shunday deb atashadi. Shu bilan birga, Map interfeysdir va standart jdk-da u asosiy ilovalarni o'z ichiga oladi: Hashmap, LinkedHashMap, Hashtable, TreeMap. Eng ko'p ishlatiladigan dastur Hashmap, shuning uchun biz uni misollarimizda ishlatamiz. Xaritani standart yaratish va to'ldirish quyidagicha ko'rinadi:
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 siz entrySet(). 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.
Agar siz sinf konstruktorlariga qarasangiz 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:
  1. 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));
  2. dan foydalaning SortedMap, aniqrog'i, TreeMapuning konstruktorida Comparatorni qabul qiluvchi uni amalga oshirish. Ushbu taqqoslagich xarita tugmachalariga qo'llaniladi, shuning uchun kalitlar interfeysni amalga oshiradigan sinflar bo'lishi kerak Comparable:

    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:
  1. Elementlarning tartibi. HashMapva Hashtableelementlar qo'shilgan tartibda saqlanishiga kafolat bermang. Bundan tashqari, ular vaqt o'tishi bilan elementlarning tartibi o'zgarmasligiga kafolat bermaydi. O'z navbatida, TreeMapu elementlarni qo'shilgan tartibda yoki berilgan taqqoslagichga muvofiq saqlashni kafolatlaydi.

  2. Yaroqli qiymatlar. HashMapkalit va null qiymatga ega bo'lish imkonini beradi, HashTableyo'q. TreeMap null qiymatlardan faqat solishtiruvchi ruxsat bergan taqdirdagina foydalanishi mumkin. Taqqoslovchidan foydalanmasdan (juftlarni qo'shilgan tartibda saqlash orqali) nullga ruxsat berilmaydi.

  3. Sinxronizatsiya. Faqat HashTablesinxronlashtiriladi, qolganlari yo'q. Agar xaritaga turli mavzular orqali kirish imkoni bo'lmasa, HashTable o'rniga HashMap dan foydalanish tavsiya etiladi.

Va amalga oshirishni umumiy taqqoslash:
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:
  1. Oddiy ob'ektni ishga tushirish:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. O'zgarmas bo'sh xaritani yaratish:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
Bunday xaritaga ma'lumotlarni qo'shishga harakat qilsak, biz quyidagilarni olamiz: UnsupportedOperationExceptionistisno. Ushbu maqolada biz Xarita interfeysidan foydalanishda paydo bo'lishi mumkin bo'lgan eng keng tarqalgan savollarni ko'rib chiqdik.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION