CodeGym /Kurslar /Java SELF AZ /HashMap kolleksiyası ilə tanışlıq

HashMap kolleksiyası ilə tanışlıq

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Cütlər toplusu: açar-dəyər.

Cütlər toplusu: açar-dəyər

Java-da başqa bir maraqlı kolleksiya var (geniş mənada) — bu, Map kolleksiyasıdır. Onun adının dəqiq Azərbaycan dilinə tərcüməsi yoxdur: əksər hallarda buna "xəritə", "ləğv" ya da sadəcə "mapa" deyirlər.

Bu kolleksiya Set kolleksiyasına oxşayır, amma burada sadəcə elementlər yox, "element cütləri" saxlanılır. Hər bir Map cütdə iki hissə var: "açar" və "dəyər".

Tutaq ki, siz proqramda şirkət işçilərinin adlarını, maaşlarını ya da həmkarlarınızın adlarını və yaşlarını saxlamaq istəyirsiniz. Belə halda sizə bu tip bir cədvəl lazım olacaq:

Ad Yaş
Sergey 21
Nikolay 22
İvan Petroviç 48
Anyuta ?

Burada hər bir sətirdə iki dəyər saxlanılır. Adı biz cütdə açar, yaşı isə cütdə dəyər adlandıracağıq.

Belə cütlər toplusuna isə xəritəMap deyilir.

Cütdə açar nə olursa-olsun seçilə bilər, amma bəzi xəritə tiplərində açar null ola bilməz. Açarlar unikal olmalıdırlar: bir xəritədə iki eyni açar ola bilməz.


2. HashMap sinfi

HashMap sinfi bütün maplardan (Map) ən populyar kolleksiyadır. Bir tərəfdən, HashSet-ə çox bənzəyir və onun bütün metodlarına malikdir, digər tərəfdən isə liste (ArrayList) bənzəyir, əgər siyahının indeksləri yalnız rəqəmlər deyil, həm də sözlər ola bilsəydi.

HashMap tipli obyekt yaratmaq üçün bu cür bir əmrdən istifadə etmək olar:

HashMap<TAçar, TDəyər> ad = new HashMap<TAçar, TDəyər>();

Burada TAçar — element cütlərinin açarlarının tipi, TDəyər isə kolleksiyada saxlanılacaq element cütlərinin dəyərlərinin tipidir HashMap.

HashMap sinfində bu cür metodlar var:

Metod Təsvir
void put(TAçar key, TDəyər value)
Kolleksiyaya cütü əlavə edir (key, value)
TDəyər get(TAçar key)
Açar üzrə dəyəri qaytarır.
boolean containsKey(TAçar key)
Kolleksiyada açarın mövcudluğunu yoxlayır
boolean containsValue(TDəyər value)
Kolleksiyada dəyərin mövcudluğunu yoxlayır
TDəyər remove(TAçar key)
Kolleksiyadan elementi silir
void clear()
Kolleksiyanı təmizləyir: bütün elementləri silir
int size()
Kolleksiyadakı element cütlərinin sayını qaytarır
Set<TAçar> keySet()
Kolleksiyanın açarlar çoxluğunu qaytarır
Collection<TDəyər> values()
Kolleksiyanın elementlər çoxluğunu qaytarır
Set<Map.Entry<TAçar, TDəyər>> entrySet()
Kolleksiyanın bütün dəyərlərini çoxluq (Set) cütləri (Map.Entry) şəklində qaytarır.

HashMap-ə elementlərin əlavə edilməsi

Elementlər xəritəyə birbaşa cütlüklər şəklində əlavə olunur: bunun üçün put() metodu istifadə edilir. Onun birinci parametrinə açar, ikincisinə isə dəyər ötürülür.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Sereqa", 21);
map.put("Nikolay", 22);
map.put("İvan Petroviç", 48);
map.put("Anyuta", null);

Əgər element əlavə edilərkən həmin açarla artıq bir element varsa, köhnə dəyər yeni ilə əvəzlənəcək.

Bu davranış HashMap-i massiv və ya siyahıya (əgər onların indeksləri yalnız rəqəmlər deyil, həm də sözlər (String) olsaydı) bənzədir.

Vacib:

Açar Tipi və Dəyər Tipi olaraq demək olar ki, istənilən tiplər çıxış edə bilər. Açar Tipinə aid bəzi əlavə tələblər var, lakin bunları Java Collections vəzifələrində kolleksiyaları detallı öyrənərkən biləcəksiniz.



3. HashMap: açarlar çoxluğu

Tutaq ki, biz sadəcə HashMap-in bütün elementlərini ekrana çıxarmaq istəyirik, bunu necə edək? Bunun üçün HashMap-dəki bütün elementlərə necə keçəcəyimizi başa düşməliyik. Bunu bir neçə üsulla etmək olar.

Ən sadə üsul – dövrəni açarlarla istifadə etməkdir

HashMap sinifinin elementlərinin sıra nömrəsi olmadığı üçün burada sayğac ilə dövrə uyğun gəlmir. Amma biz keySet() metodu vasitəsilə açarlar çoxluğunu əldə edə bilərik, çoxluğa necə keçiləcəyini isə artıq bilirsiniz:

Kod Təsvir
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Seryoqa", 21);
map.put("Nikolay", 22);
map.put("İvan Petroviç", 48);
map.put("Anyuta", null);

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






Bütün map-in açarları üzrə dövr

Açar ilə dəyər əldə edirik

keySet() metodu açarların çoxluğunu qaytarır. Bu çoxluğu iki üsulla istifadə etmək olar:

Qısa yazılış Uzun yazılış
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. Cütlər üzrə dövrədən istifadə

Daha mürəkkəb bir üsul da var: Map-i element cütlərinin toplusuna çevirmək, sonra isə toplu elementlər üzərində dövrədən istifadə etmək olar, bunu əvvəlki dərslərimizdə öyrənmişdik.

HashMap kolleksiyasında cüt elementi saxlamaq üçün köməkçi sinif var. O, təxminən belə görünür:

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

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

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

entrySet() metodunun HashMap<TKey, TValue> tipli obyektə tətbiqi nəticəsində əmələ gələn nəticənin tipi Set<Entry<TKey, TValue>> olacaq:

Set<Entry<Açar, Dəyər>> ad = map.entrySet();

Burada biz Set tipini, onun parametr-dəyərini və parametri kimi verilən mürəkkəb tipi (Entry) görürük, həm də iki parametrlə.

Yeni başlayanlar üçün bunlar çox qarışıq görünə bilər. Amma başa düşsəniz, belə kodlar yaza bilərsiniz:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Seryoga", 21);
map.put("Nikolay", 22);
map.put("İvan Petroviç", 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);
}

Amma bu kodu bir az sadələşdirmək olar:

Birincisi, entries üçün ayrıca dəyişən istifadə etməyib, birbaşa entrySet() metodunu for dövrəsi daxilində çağıraq:

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

İkincisi, var operatorundan istifadə edərək, element cütlərinin tipini avtomatik tapa bilərik:

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

Pis deyil, elə deyilmi?



5. ArrayList vs HashMap müqayisəsi

HashMap çox ArrayList-ə bənzəyir, amma burada indekslər kimi rəqəmlər deyil, sözlər (və ya başqa açar növü) istifadə olunur.

Əgər HashMap-də açar kimi Integer istifadə edilsə, bu, daha çox ArrayList-ə bənzəyir. Müqayisə edin:

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

list.add("Salam");
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, "Salam");
map.put(1, "Hello");

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

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

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION