CodeGym /Kurslar /JAVA 25 SELF /«Öz lüğətiniz» — HashMap&l...

«Öz lüğətiniz» — HashMap<K,V>

JAVA 25 SELF
Səviyyə, Dərs
Mövcuddur

1. Giriş

Biz artıq bilirik ki, ArrayList — öz-özünə böyüyən «sonsuz massiv» kimidir. Amma onun bir məhdudiyyəti var: elementlərə müraciət nömrə (indeks) üzrə aparılır. Əgər bizdə min nəfərlik siyahı varsa və Alisanın telefonunu tapmaq istəyiriksə, ya onun indeksini bilməliyik, ya da hamını ardıcıl gəzməliyik.

Həyatda isə məlumatları çox vaxt unikal əlamətə görə axtarırıq:

  • ada görə telefon nömrəsini axtarırıq,
  • pasport nömrəsinə görə sahibini tapırıq,
  • loginə görə parolu tapırıq,
  • id-ə görə bazada obyekt axtarırıq.

Bunun üçün belə bir struktur lazımdır: «açarı aldım → dərhal dəyəri tapdım». Java-da bunu HashMap<K,V> edir.

Analoqiya:
Adi kağız lüğəti təsəvvür edin. Siz «house» sözünün tərcüməsini axtarırsınız. Bütün səhifələri ard-arda çevirməyə ehtiyac yoxdur. Dərhal «H» hərfinə gedib lazım olan sözü tapırsınız. HashMap də belə işləyir: açara (sözə) görə dəyəri (tərcüməni) dərhal alırıq.

Lüğətin yaradılması

Lüğət yaratmaq üçün hansı tiplərin açar, hansılarının isə dəyər olacağını göstərmək lazımdır.

import java.util.HashMap;

HashMap<String, String> phonebook = new HashMap<String, String>();

Burada:

  • String (birinci tip) — açarın tipi (insanın adı).
  • String (ikinci tip) — dəyərin tipi (telefon nömrəsi).

İndi phonebook — sanki həqiqi telefon kitabçasıdır.

Başqa variantlara nümunələr:

HashMap<String, Integer> grades = new HashMap<String, Integer>();  // ad → qiymət
HashMap<Integer, String> users = new HashMap<Integer, String>();   // id → ad
HashMap<String, Boolean> flags = new HashMap<String, Boolean>();   // açar → məntiqi dəyər

ArrayList-dən fərqli olaraq, lüğətdə add() metodu yoxdur, amma öz maraqlı metodları var.

2. Metod put(key, value) — cüt əlavə etmək

HashMap-in massivlərdən və siyahılardan əsas fərqi ondadır ki, o, sadəcə dəyərlər toplusunu deyil, açar–dəyər cütlərini saxlayır. Bu onu əsl lüğətə bənzədir: hər sözün tərcüməsi, hər adın — telefonu, hər loginin — parolu var.

Nümunə:

phonebook.put("Alisa", "+380501112233");
phonebook.put("Bob", "+380671234567");

İndi bizim telefon kitabçamızda:

  • "Alisa" açarı "+10501112233" dəyəri ilə əlaqələndirilib,
  • "Bob" açarı "+10671234567" dəyəri ilə əlaqələndirilib.

Bu o deməkdir ki, dəyəri (telefonu) almaq üçün açarı (adı) bilmək kifayətdir.

Vacibdir: açarlar unikaldır. Əgər mövcud açarla yeni dəyər əlavə etməyə çalışsaq, köhnə dəyər üzərinə yazılacaq.

phonebook.put("Alisa", "+10999999999");

İndi Alisanın yalnız yeni nömrəsi qaldı: köhnə nömrə itdi.

Nəticə: put — qeydləri əlavə etmək və ya yeniləmək üçündür. Açar yenidirsə — qeyd yaradılır. Açar artıq varsa — qeyd yenilənir.

3. Metod get(key) — dəyəri almaq

Dəyəri tapmaq üçün açarı bilmək lazımdır. Bu, HashMap-in əsas üstünlüyüdür: açar üzrə axtarış çox sürətlidir, demək olar ani olur — istər min, istərsə də milyon qeyd olsun.

Nümunə:

System.out.println(phonebook.get("Alisa"));

Çıxış:

+10501112233

Belə açar yoxdursa, get null qaytaracaq:

System.out.println(phonebook.get("Charli")); // null

Bu o deməkdir: «lüğətdə "Charli" açarı yoxdur».

4. Metod containsKey(key) — mövcudluğu yoxlamaq

null-a rast gəlməmək üçün əvvəlcə açarın lüğətdə olub-olmadığını yoxlamaq faydalıdır.

Nümunə:

System.out.println(phonebook.containsKey("Charli"));

Çıxış:

false

Beləcə, öncədən başa düşə bilərik:

  • açar yoxdursa — yeni qeyd yaradırıq,
  • açar varsa — onu yeniləyirik.

Tez-tez istifadə olunan üsul:

if (phonebook.containsKey("Alisa")) 
{
    System.out.println("Alisanın artıq nömrəsi var!");
} 
else 
{
    phonebook.put("Alisa", "+10111111111");
}

5. Metod remove(key) — qeydi silmək

Silmək də eyni dərəcədə sadədir: yalnız açarı bilmək kifayətdir.

phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));

Çıxış:

null

Artıq "Bob" açarlı qeyd lüğətdə yoxdur.

6. Bütün cütləri iterasiya etmək

Çox vaxt təkcə konkret açar üzrə dəyəri almaq deyil, bütün lüğəti tam çıxarmaq da lazım olur. Bunun üçün entrySet() metodu istifadə olunur.

for (var entry : phonebook.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

Nümunə çıxışı:

Alisa -> +10501112233

Beləliklə, biz həm açara (entry.getKey()), həm də dəyərə (entry.getValue()) dərhal çıxış əldə edirik.

7. Təcrübə: sözlərin sayılması

Klassik bir tapşırıqa baxaq — mətndə sözlərin təkrar sayını hesablamaq. Bu, HashMap-in ümumiyyətlə nə üçün lazım olduğunun ən parlaq nümunələrindən biridir.

String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();

for (String w : text.split(" ")) 
{
    Integer old = freq.get(w);
    freq.put(w, (old == null) ? 1 : old + 1);
}

System.out.println(freq);

Çıxış:

{core=1, java=3}

Gəlin detallı baxaq, burada nə baş verir:

  1. "java java core java" sətrini sözlərə böldük.
  2. Hər söz üçün lüğətdə artıq olub-olmadığını yoxlayırıq (freq.get(w)).
  3. Yoxdursa (null), deməli bu sözün ilk görünüşüdür → 1 qoyuruq.
  4. Varsa, deməli söz artıq rast gəlinib → dəyəri bir vahid artırırıq.

Real tətbiqlər:

  • API-yə müraciətlərin sayını hesablamaq,
  • mətndə sözlərin tezliyi üzrə statistika,
  • anbardakı malların sayını saxlamaq.

8. Təcrübə: telefon kitabçası

Gəlin bir az daha böyük bir tətbiq yazaq.

import java.util.HashMap;
import java.util.Scanner;

public class PhonebookApp {
    public static void main(String[] args) 
    {
        HashMap<String, String> phonebook = new HashMap<String, String>();
        Scanner console = new Scanner(System.in);

        while (true) 
        {
            System.out.print("Adı daxil edin (və ya çıxmaq üçün boş sətir): ");
            String name = console.nextLine();
            if (name.isEmpty()) break;

            System.out.print("Nömrəni daxil edin: ");
            String phone = console.nextLine();

            phonebook.put(name, phone);
        }

        System.out.println("Telefon kitabçası:");
        for (var entry : phonebook.entrySet()) 
        {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

Proqram mini-arayış kitabçası kimi işləyir. Siz adları və telefonları daxil edirsiniz, onlar HashMap-də saxlanılır. Sonda bütün siyahını çıxarmaq olar. Lüğətlər real layihələrdə çox tez-tez istifadə olunur.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Dəyərin əlavə edilməsi və alınması
Dəyərin əlavə edilməsi və alınması
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Açarın mövcudluğunu yoxlama
Açarın mövcudluğunu yoxlama
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Lüğətdən elementin silinməsi
Lüğətdən elementin silinməsi
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Mətn daxilində sözlərin sayının hesablanması
Mətn daxilində sözlərin sayının hesablanması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION