JavaRush /Kurslar /All lectures for UZ purposes /HashMap to'plamlari bilan tanishuv

HashMap to'plamlari bilan tanishuv

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Kalit-qiymat juftliklar to'plami.

Kalit-qiymat juftliklar to'plami

Javada yana bir qiziqarli to'plam bor (keng ma'noda) — bu Map to'plami. Uning nomini rus tiliga aniq tarjima yo'q: ko'pincha uni "xarita", "lug'at" yoki oddiygina "mapa" deb atashadi.

Bu to'plam Set to'plamiga o'xshaydi, faqat ko'plab elementlar o'rniga, ko'plab "element juftliklari"ni saqlaydi. Har bir Map element juftligi "kalit" va "qiymat"dan iborat.

Aytaylik, dasturda kompaniya xodimlarining ismlarini, ularning maoshlarini yoki do'stlaringizning ismlarini va ularning yoshlarini saqlamoqchisiz. Bunda sizga quyidagiga o'xshash jadval kerak bo'ladi:

Ism Yosh
Sergey 21
Nikolay 22
Ivan Petrovich 48
Anyuta ?

Bu yerda har bir qator qiymatlar juftligini saqlaydi. Ismni juftlik kaliti deb ataymiz, yoshni esa juftlik qiymati deb ataymiz.

Bunday juftliklar to'plamiga xarita deb ataladi — Map.

Juftlik kaliti har qanday narsadan iborat bo'lishi mumkin, lekin ayrim xarita turlarida kalit null bo'lishi mumkin emas. Kalitlar yagona bo'lishi kerak: bitta xaritada ikki xil kalit bo'lishi mumkin emas.


2. HashMap klassi

HashMap klassi barcha xaritalar (Map) orasida eng mashhur to'plamdir. Bir tomondan, u HashSetga juda o'xshaydi va uning barcha metodlarini o'z ichiga oladi, boshqa tomondan, indekslari raqamlar o'rniga so'zlar bo'lgan ro'yxatga (ArrayList) o'xshaydi.

HashMap turidagi ob'ekt yaratish uchun quyidagi ko'rinishdagi buyruqdan foydalanish mumkin:

HashMap<TKey, TValue> name = new HashMap<TKey, TValue>();

Bu yerda TKey — bu juftlik elementlarining kalitlari turi, TValue — bu juftlik elementlarining qiymatlari turi, ular HashMap to'plamida saqlanadi.

HashMap klassi quyidagi metodlarga ega:

Metod Tavsif
void put(TKey key, TValue value)
To'plamga juftlik (key, value) qo'shadi
TValue get(TKey key)
Kalit bo'yicha qiymatni qaytaradi.
boolean containsKey(TKey key)
To'plamda kalit mavjudligini tekshiradi
boolean containsValue(TValue value)
To'plamda qiymat mavjudligini tekshiradi
TValue remove(TKey key)
Elementni to'plamdan o'chiradi
void clear()
To'plamni tozalaydi: barcha elementlarni o'chiradi
int size()
To'plamdagi juftlik elementlar sonini qaytaradi
Set<TKey> keySet()
To'plamning kalitlar to'plamini qaytaradi
Collection<TValue> values()
To'plamning elementlar to'plamini qaytaradi
Set<Map.Entry<TKey, TValue>> entrySet()
To'plamdagi barcha qiymatlarni Map.Entry juftliklari (Set) to'plam sifatida qaytaradi.

HashMapga elementlar qo'shish

Elementlar kartaga darhol juftliklar sifatida qo'shiladi: buning uchun put() metodi ishlatiladi. Oldiniga kalitni, so'ngra qiymatni o'tkazamiz.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Serega", 21);
map.put("Nikolay", 22);
map.put("Ivan Petrovich", 48);
map.put("Anyuta", null);

Agar element qo'shish jarayonida kalit mavjud bo'lsa, eskisi yangisiga almashtiriladi.

Bu HashMapni massiv yoki ro'yxatga o'xshatadi, agar indekslari raqamlar o'rniga so'zlar (String) bo'lsa.

Muhim:

Kalit turi va qiymat turi deyarli har qanday turlardan iborat bo'lishi mumkin. Kalit turiga qo'shimcha talablar mavjud, lekin ularni siz Java Collections qismida batafsil o'rganasiz.



3. HashMapning kalitlar to'plami

Aytaylik biz HashMapdagi barcha elementlarni ekranga chiqarmoqchimiz, buni qanday amalga oshirishimiz kerak? Buning uchun HashMapdagi barcha elementlarni qanday qilib bosib o'tishni tushunish kerak. Buni bir necha usulda amalga oshirish mumkin.

Eng oddiy usul — kalitga asoslangan siklni ishlatish

HashMap klassining elementlarida tartib raqami yo'q, shuning uchun bu yerda hisoblagichli sikl ishlamaydi. Lekin biz keySet() metodi yordamida kalitlar to'plamini olsak bo'ladi, va qanday qilib to'plam ustida yurishni siz allaqachon bilasiz:

Kod Tavsif
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Serega", 21);
map.put("Nikolay", 22);
map.put("Ivan Petrovich", 48);
map.put("Anyuta", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






mapdagi barcha kalitlar bo'yicha sikl

Kalit bo'yicha qiymatni olish

keySet() metodi kalitlar to'plamini qaytaradi. Bu to'plamni ikki usulda qo'llash mumkin:

Kompakt yozuv Uzoq yozuv
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. Palar bo'yicha siklni ishlatish

Boshqa murakkab usul ham bor: Mapni elementlar juftligi to'plamiga aylantirishimiz mumkin va keyin oldin o'rganganimizdek to'plam elementlari bo'yicha siklni qo'llashimiz mumkin.

HashMap to'plamida elementlar juftligini saqlash uchun yordamchi klass mavjud. U taxminan quyidagicha ko'rinadi:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

entrySet() metodi HashMap<TKey, TValue> ob'ektida chaqirilganda natijasi Set<Entry<TKey, TValue>> turida bo'ladi:

Set<Entry<Key, Value>> name = map.entrySet();

Bu yerda biz murakkab Set turini ko'rmoqdamiz, lekin parametr-qiymat sifatida yana ikki parametrli murakkab (Entry) tur ishlatiladi.

Yangi kelganlarga bu juda oson chalkashib ketishi mumkin. Lekin, agar tushunsangiz, quyidagi kodni yozishga qodir bo'lasiz:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Serega", 21);
map.put("Nikolay", 22);
map.put("Ivan Petrovich", 48);
map.put("Anyuta", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Bu kodni biroz sodda qilish mumkin:

Birinchidan, entries uchun alohida o'zgaruvchi yaratmasdan, darhol sikl for ichida entrySet() metodini chaqirish mumkin:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Ikkinchidan, yaqinda paydo bo'lgan var operatoridan foydalanib, juftlik turini avtomatik ravishda chiqarishimiz mumkin:

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Yaxshi, to'g'rimi?



5. ArrayList va HashMap solishtirish

HashMap ArrayListga juda o'xshaydi, lekin unda indekslar o'rniga raqamlar emas, balki so'zlar (yoki boshqa turdagi kalitlar) ishlatiladi.

Agar HashMap kaliti sifatida Integerni ishlatsak, u ArrayListga yanada o'xshab ketadi. Solishtiring:

ArrayList<String> bilan kod HashMap<Integer, String> bilan kod
ArrayList<String> list = new ArrayList<String>();

list.add("Salom");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Salom");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION