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