1. 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 |
|---|---|
|
Kolleksiyaya cütü əlavə edir (key, value) |
|
Açar üzrə dəyəri qaytarır. |
|
Kolleksiyada açarın mövcudluğunu yoxlayır |
|
Kolleksiyada dəyərin mövcudluğunu yoxlayır |
|
Kolleksiyadan elementi silir |
|
Kolleksiyanı təmizləyir: bütün elementləri silir |
|
Kolleksiyadakı element cütlərinin sayını qaytarır |
|
Kolleksiyanın açarlar çoxluğunu qaytarır |
|
Kolleksiyanın elementlər çoxluğunu qaytarır |
|
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.
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 |
|---|---|
|
Bütün map-in açarları üzrə dövrAç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ış |
|---|---|
|
|
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 |
|---|---|
|
|
GO TO FULL VERSION