JavaRush /Java blogi /Random-UZ /Java'da HashMap - bu qanday xarita?

Java'da HashMap - bu qanday xarita?

Guruhda nashr etilgan
Salom! Bugun biz boshqa ma'lumotlar strukturasi - Xarita haqida gaplashamiz. Uning rasmiy ruscha nomi "assotsiativ massiv" dir, lekin u tez-tez ishlatilmaydi. Ko'proq keng tarqalgan variantlar "lug'at", "xarita" yoki (ko'pincha) jargon anglicism "xarita" :) Xaritaning ichida ma'lumotlar "kalit" - "qiymat" formatida, ya'ni juftlikda saqlanadi. Ikkala kalit ham, qiymatlar ham har qanday ob'ektlar bo'lishi mumkin - raqamlar, satrlar yoki boshqa sinflar ob'ektlari.

Xarita boshqa ma'lumotlar tuzilmalaridan nimasi bilan farq qiladi

Ilgari biz elementlar o'zlari tomonidan saqlanadigan ma'lumotlar tuzilmalarini ko'rib chiqdik. Massivda yoki ArrayList / LinkedList , biz ma'lum miqdordagi elementlarni saqlaymiz. Ammo bizning vazifamiz biroz o'zgarsa-chi? Misol uchun, biz 100 kishidan iborat ro'yxatni yaratish vazifasiga duch kelayotganimizni tasavvur qiling, unda shaxsning to'liq ismi va pasport raqami saqlanadi. Aslida, bu unchalik qiyin emas. Masalan, siz ikkalasini ham bir qatorga joylashtirishingiz va quyidagi qatorlar ro'yxatini yaratishingiz mumkin: "Anna Ivanovna Reshetnikova, 4211 717171." Ammo bu yechimning ikkita kamchiligi bor. Birinchidan, bizga pasport qidirish funksiyasi kerak bo'lishi mumkin. Va ma'lumotni saqlash uchun ushbu format bilan bu muammoli bo'ladi. Ikkinchidan, bir xil pasport raqamlariga ega bo'lgan ikki xil odamni yaratishga hech narsa to'sqinlik qilmaydi. Va bu bizning yechimimizning eng jiddiy kamchiligi. Bunday holatlar butunlay chiqarib tashlanishi kerak, bir xil pasport raqamiga ega ikkita odam yo'q. Bu erda Xarita va uning ko'rsatilgan xususiyatlari bizga yordam beradi (ma'lumotlarni "kalit" - "qiymat" formatida juftlikda saqlash). Keling, eng keng tarqalgan Xarita dasturini - Java HashMap sinfini ko'rib chiqaylik .HashMap - bu qanday xarita?  - 1

Java-da HashMap yaratish va sinf bilan ishlash

Ushbu dasturni yaratish juda oddiy:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Bu erda biz lug'at yaratdik, unda elementlar "raqam-string" formatida saqlanadi. Raqam kalit bo'ladi va satr qiymat bo'ladi. Shuningdek, biz qanday turdagi kalitlarga ega bo'lishini ( Integer) va qaysi turdagi qiymatlarni ( String) ko'rsatdik. Nega bunday? Birinchidan, HashMap-dagi kalit har doim noyobdir . Bu biz uchun juda yaxshi ishlaydi, chunki biz pasport raqamini kalit sifatida ishlatishimiz va takrorlashdan qochishimiz mumkin. Va to'liq ismli chiziq qiymat sifatida ishlaydi (turli odamlarning to'liq ismlari osongina takrorlanishi mumkin, biz uchun buning hech qanday yomon joyi yo'q).

HashMap-ga yangi juftlik qo'shilmoqda

Bu vazifa quyidagicha ko'rinadi:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
Buning uchun usul qo'llaniladi put(). Bundan tashqari, HashMap-da bekor qilingan usul mavjud toString(), shuning uchun uni konsolga chop etish mumkin. Chiqish quyidagicha bo'ladi: {212133=Lidiya Arkadevna Bublikova, 8082771=Donald Jon Tramp, 162348=Ivan Mixaylovich Serebryakov}

HashMap kalitlarining xususiyatlari

Endi kalitlar haqiqatan ham noyob yoki yo'qligini tekshirib ko'raylik? Keling, xaritada kaliti bo'lgan yangi element qo'shishga harakat qilaylik :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Natija: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Jon Tramp, 162348=Viktor Mixaylovich Stychkin} Ko‘rib turganingizdek, 162348 kalitli oldingi element ustiga yozilgan. "Kalit" bir sababga ko'ra kalit deb nomlangan. HashMap-dagi qiymatlarga kalit orqali kirish mumkin (lekin aksincha emas - kalitni qiymat bo'yicha olish mumkin emas, chunki qiymatlarni takrorlash mumkin). Bu elementni olish, shuningdek, HashMap-dan elementni olib tashlash misollarida aniq ko'rinadi:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
Lug'atdan qiymat olish yoki juftlikni o'chirish uchun biz ushbu qiymatga mos keladigan yagona kalitni get()usullarga o'tkazishimiz kerak. HashMap-da massivlar yoki ro'yxatlardagi kabi raqamli indekslar mavjud emas - qiymatga kalit orqali kirish mumkin. Konsol chiqishi: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Jon Tramp}remove()

Kalit va qiymat mavjudligini tekshirish

ArrayList va LinkedList sinflarida biz ro'yxatda ma'lum bir element mavjudligini tekshirishimiz mumkin. HashMap ham buni amalga oshirishga imkon beradi va juftlikning ikkala qismi uchun: uning usullari containsKey()(kalit mavjudligini tekshiradi) va containsValue()(qiymat mavjudligini tekshiradi) mavjud.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Natija: noto'g'ri rost

Barcha kalitlar va qiymatlar ro'yxatini olish

HashMap'ning yana bir qulay xususiyati shundaki, barcha kalitlar va barcha qiymatlar ro'yxatini alohida olishingiz mumkin . Buning uchun usullar keySet()va qo'llaniladi values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Kalitlar to'plamga chiqariladi Set. Uning o'ziga xosligi shundaki, u takrorlanuvchi elementlarni o'z ichiga olmaydi. Endi eslash kerak bo'lgan asosiy narsa shundaki, barcha kalitlar ro'yxati HashMap-dan alohida to'plamga olinishi mumkin. Misolda biz qiymatlarni normal holatga saqladik ArrayList. Konsol chiqishi: Kalitlar: [212133, 8082771, 162348] Qadriyatlar: [Lidiya Arkadyevna Bublikova, Donald Jon Tramp, Ivan Mixaylovich Serebryakov] Usullar biz o‘tgan avvalgi tuzilmalar bilan bir xil size()ishlaydi : birinchisi qator elementlarni qaytaradi. clear()lug'at hozirgi vaqtda, ikkinchisi barcha elementlarni o'chiradi.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Natija: 3 {} Bizning HashMapda kamida bitta element mavjudligini tekshirish uchun biz quyidagi usuldan foydalanishimiz mumkin isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Natija: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Jon Tramp, 162348=Ivan Mixaylovich Serebryakov} Endi biz konsolga faqat dastlabki tekshirishdan keyin chiqamiz :)

Ikkita xaritani bittaga birlashtirish

Yana bir qiziq jihat shundaki, ikkita xaritani birlashtirish mumkin . Buning uchun bir usul mavjud putAll(). Biz uni birinchi HashMap da chaqiramiz , ikkinchisini argument sifatida o'tkazamiz va ikkinchisining elementlari birinchisiga qo'shiladi:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Xulosa: { 917352=Aleksey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Jon Tramp, 925648=Maksim Olegovich Arxarov, 162348=Ivan Mixaylovich Serebryakov pasportiga oid barcha maʼlumotlarga ega boʻlganlar . Endi murakkabroq misolni ko'rib chiqamiz. Ya'ni, tsiklda HashMap orqali takrorlang.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Interfeys Map.Entryshunchaki lug'at ichidagi kalit-qiymat juftligini bildiradi. Usul entrySet()bizning HashMap-dagi barcha juftliklar ro'yxatini qaytaradi (bizning xaritamiz aynan shunday Kirish juftliklaridan iborat bo'lgani uchun biz alohida kalitlar yoki qiymatlarni emas, balki juftliklar ustida takrorlaymiz). Xulosa: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald Jon Tramp 162348=Ivan Mixaylovich Serebryakov Ushbu maqolani kelajak uchun saqlang: https://habr.com/ru/post/128017/ Hozir uni o'qishga hali erta, lekin kelajakda , HashMap-dan foydalanishni o'rgansangiz, bu ma'lumotlar strukturasi ichkaridan qanday ishlashini tushunishga yordam beradi. Shuningdek, HashMap-dagi rasmiy Oracle hujjatlarini tekshirishni unutmang .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION