1. Kulcs-érték párok halmaza.

Kulcs-érték párok halmaza

A Java nyelven egy másik érdekes gyűjtemény (nagyvonalakban véve) a Map. Néha ezt az adatstruktúrát szótárnak is nevezik.

Hasonló a Setgyűjteményhez, de inkább "elempárokat" tárol, nem pedig elemek halmazát. Minden pár Mapkét elemből áll: egy "kulcsból" és egy "értékből".

Tegyük fel, hogy azt szeretné, hogy a program tárolja az alkalmazottak nevét és fizetését, vagy a munkatársai nevét és életkorát. Akkor szükséged lesz egy ilyen táblázatra:

Név Kor
Elon 21
Jeff 22
Számla 48
Warren ?

Minden sor néhány értéket tartalmaz. A névre a pár kulcsaként hivatkozunk , az életkorra pedig a pár értékére .

E párok teljes halmaza a mi térképünk ( Map).

A pár kulcsa bármi lehet, kivéve null. A kulcsoknak egyedinek kell lenniük: egy térkép nem tartalmazhat két azonos kulcsot.


2. HashMaposztály

Az HashMaposztály a legnépszerűbb gyűjtemény Map. Egyrészt nagyon hasonlít a HashSet-hez, és minden metódusával rendelkezik. Másrészt olyan, mint egy lista ( ArrayList), amely szavakat (vagy bármi mást) használhat indexként.

Létrehozhat HashMapegy ilyen utasítást:

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

Hol KeyTypevan a tárolt párokban lévő kulcsok típusa, illetve ValueTypea gyűjteményben tárolt párokban lévő értékek típusa HashMap.

Az HashMaposztálynak vannak ilyen metódusai:

Módszer Leírás
void put(KeyType key, ValueType value)
Hozzáadja a ( key, value) párt a gyűjteményhez
ValueType get(KeyType key)
A kulcshoz tartozó értéket adja vissza.
boolean containsKey(KeyType key)
Ellenőrzi, hogy van-e kulcs a gyűjteményben
boolean containsValue(ValueType value)
Ellenőrzi, hogy van-e érték a gyűjteményben
ValueType remove(KeyType key)
Eltávolít egy elemet a gyűjteményből
void clear()
Törli a gyűjteményt, eltávolítja az összes elemet
int size()
A gyűjteményben lévő kulcs-érték párok számát adja vissza
Set<KeyType> keySet()
Visszaadja a gyűjtemény kulcskészletét
Collection<ValueType> values()
A gyűjtemény elemeit tartalmazó halmazt ad vissza
Set<Map.Entry<KeyType, ValueType>> entrySet()
A gyűjtemény Setösszes párjának ( ) halmazát ( ) adja eredményül .Map.Entry

Elemek hozzáadása aHashMap

Az elemek a módszerrel párokba kerülnek a térképhez put(). A kulcsot első argumentumként, az értéket pedig másodikként adjuk át.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Kulcs-érték pár hozzáadásakor, ha a kulcs már létezik a gyűjteményben, akkor a régi érték helyére az új érték lép.

Ez a viselkedés HashMapolyan tömböt vagy listát hoz létre, amelynek indexei Stringszámok helyett szavak ( ).

Fontos:

Szinte bármilyen típus lehet KeyType vagy ValueType. Van néhány apró további követelmény a KeyType-hoz, és ezeket megtudhatja, ha részletesebben tanulmányozza a gyűjteményeket a Java Collections küldetésben.



3. A részhalmazai HashMap: a kulcsok halmaza

Tegyük fel, hogy csak az a betű összes bejegyzését szeretnénk megjeleníteni HashMapa képernyőn. Hogyan csináljuk ezt? Ehhez tudnunk kell, hogyan kell végigmenni az összes bejegyzésen a HashMap. Ezt többféleképpen is meg lehet tenni.

A legegyszerűbb módja a billentyűk áthurkolása

HashMapa bejegyzések nincsenek sorszámozva, így a számlálós hurok itt nem működik. De a metódus segítségével kaphatunk egy kulcskészletet keySet(), és már tudod, hogyan kell egy halmazon át iterálni:

Kód Leírás
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

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






Hurkolja át a kulcsokat map

a Kulcshoz tartozó érték lekérése

A keySet()metódus egy kulcskészletet ad vissza. Ezt a készletet kétféleképpen használhatja:

Kompakt jelölés Hosszú jelölés
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. Kulcs-érték párok hurkolása

Van egy bonyolultabb módszer is: átalakíthatja a-t kulcs-érték párok halmazáváMap , majd a halmaz elemei között hurkolhatja, ahogy azt már megtanultuk.

A HashMapgyűjteménynek van egy segítő osztálya, amely kulcs-érték párt tárol. Körülbelül így néz ki:

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

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

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

entrySet()A metódus objektumon történő meghívásának eredménye a következő lesz :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

Itt van az általános Setosztály típusparaméterrel, ami viszont egy általános típus ( Entry), két típusparaméterrel.

Egy kezdő nagyon könnyen összezavarodik ezzel kapcsolatban. De ha rájöttél, írhatsz egy kódot, például:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", 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);
}

Ez a kód egy kicsit leegyszerűsíthető:

Először kihagyhatja egy külön változó létrehozását, entriesés ehelyett entrySet()közvetlenül a cikluson belül hívhatja meg a metódust for:

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

Másodszor, a nemrég bevezetett operátor segítségével automatikusan kikövetkeztetheti a kulcs-érték párvar típusát :

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

Nem rossz, mi?



5. Összehasonlítása ArrayListésHashMap

Az A HashMaperősen hasonlít egy olyan ArrayListkarakterláncra, amely lehetővé teszi karakterláncok (vagy más típusok) indexként való használatát (a kulcsokat).

IntegerHa a billentyűket használja HashMap, akkor még jobban hasonlít egy -re ArrayList. Hasonlítsuk össze:

ArrayList<String> kóddal Kód HashMap <Integer, String> segítségével
ArrayList<String> list = new ArrayList<String>();

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

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

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