1. 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 |
|---|---|
|
To'plamga juftlik (key, value) qo'shadi |
|
Kalit bo'yicha qiymatni qaytaradi. |
|
To'plamda kalit mavjudligini tekshiradi |
|
To'plamda qiymat mavjudligini tekshiradi |
|
Elementni to'plamdan o'chiradi |
|
To'plamni tozalaydi: barcha elementlarni o'chiradi |
|
To'plamdagi juftlik elementlar sonini qaytaradi |
|
To'plamning kalitlar to'plamini qaytaradi |
|
To'plamning elementlar to'plamini qaytaradi |
|
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.
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 |
|---|---|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
GO TO FULL VERSION