1. Et sæt nøgleværdi-par.

Et sæt nøgleværdi-par

I Java er en anden interessant samling (i store træk) Map. Nogle gange kaldes denne datastruktur også for en ordbog.

Det ligner Setsamlingen, men det gemmer et sæt "par" af elementer i stedet for et sæt elementer. Hvert par i a Mapbestår af to elementer: en "nøgle" og en "værdi".

Lad os sige, at du vil have dit program til at gemme medarbejdernavne og deres lønninger eller dine kollegers navne og deres alder. Så skal du bruge et bord som dette:

Navn Alder
Elon 21
Jeff 22
Regning 48
Warren ?

Hver række indeholder et par værdier. Vi vil referere til navnet som parrets nøgle , og alderen som parrets værdi .

Hele sættet af disse par er vores kort ( Map).

Et pars nøgle kan være alt undtagen null. Nøgler skal være unikke: Et kort kan ikke indeholde to identiske nøgler.


2. HashMapklasse

Klassen HashMaper den mest populære form for Mapsamling. På den ene side minder det meget om HashSet og har alle sine metoder. På den anden side er det ligesom en liste ( ArrayList), der kan bruge ord (eller noget andet) som sine indekser.

Du kan oprette en HashMapved hjælp af en erklæring som denne:

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

Hvor KeyTypeer typen af ​​nøglerne i de lagrede par, og ValueTypeer typen af ​​værdierne i parrene gemt i HashMapsamlingen.

Klassen HashMaphar metoder som denne:

Metode Beskrivelse
void put(KeyType key, ValueType value)
Tilføjer ( key, value) parret til samlingen
ValueType get(KeyType key)
Returnerer den værdi, der er knyttet til en nøgle.
boolean containsKey(KeyType key)
Kontrollerer, om der findes en nøgle i samlingen
boolean containsValue(ValueType value)
Kontrollerer, om der findes en værdi i samlingen
ValueType remove(KeyType key)
Fjerner et element fra samlingen
void clear()
Rydder samlingen og fjerner alle elementer
int size()
Returnerer antallet af nøgleværdi-par i samlingen
Set<KeyType> keySet()
Returnerer nøglesættet i samlingen
Collection<ValueType> values()
Returnerer et sæt, der indeholder elementerne i samlingen
Set<Map.Entry<KeyType, ValueType>> entrySet()
Returnerer et sæt ( Set) af alle par ( Map.Entry) i samlingen.

Tilføjelse af elementer til enHashMap

Elementer tilføjes til et kort som par ved hjælp af put()metoden. Nøglen sendes som det første argument, og værdien videregives som det andet.

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

Når du tilføjer et nøgle-værdi-par, og hvis nøglen allerede findes i samlingen, erstattes den gamle værdi med den nye værdi.

Denne adfærd gør en HashMaplike til en matrix eller en liste, hvis indeks er ord ( String) i stedet for tal.

Vigtig:

Næsten enhver type kan være KeyType eller ValueType. Der er nogle små yderligere krav til KeyType, og du vil lære om dem, når du studerer samlinger mere detaljeret i Java Collections-questen.



3. Undersæt af en HashMap: sættet af nøgler

Lad os sige, at vi bare vil vise alle indtastningerne i en HashMappå skærmen. Hvordan gør vi dette? For at gøre dette skal vi vide, hvordan vi gennemgår alle poster i HashMap. Dette kan gøres på flere måder.

Den nemmeste måde er at sløjfe over tasterne

HashMapindgange er ikke nummereret sekventielt, så en løkke med en tæller vil ikke fungere her. Men vi kan få et sæt nøgler ved hjælp af keySet()metoden, og du ved allerede, hvordan du itererer over et sæt:

Kode Beskrivelse
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);
}






Sløjfe over tasterne på den map

Hent den værdi, der er knyttet til nøglen

Metoden keySet()returnerer et sæt nøgler. Du kan bruge dette sæt på to måder:

Kompakt notation Lang notation
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. Looping over nøgleværdi-par

Der er også en mere kompliceret måde: du kan transformere a Maptil et sæt nøgleværdi-par og derefter loope over elementerne i sættet, som vi allerede har lært.

Samlingen HashMaphar en hjælperklasse, der gemmer et nøgleværdi-par. Det ser omtrent sådan ud:

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

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

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

Resultatet af at kalde entrySet()metoden på et objekt vil være :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

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

Her har vi den generiske Setklasse med en typeparameter, som igen er en generisk type ( Entry) med to typeparametre.

Det er meget nemt for en nybegynder at blive forvirret over dette. Men når du har fundet ud af det, kan du skrive kode som:

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);
}

Når det er sagt, kan denne kode forenkles lidt:

Først kan du springe over at oprette en separat variabel for entriesog i stedet kalde entrySet()metoden direkte inde i forløkken:

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

For det andet kan du bruge den nyligt introducerede varoperator til automatisk at udlede typen af ​​nøgleværdi-parret :

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

Ikke dårligt, vel?



5. Sammenligning af ArrayListogHashMap

A HashMapminder meget om en ArrayList, der tillader strenge (eller andre typer) at blive brugt som indekser (nøglerne).

Hvis du bruger Integertil tasterne i en HashMap, så bliver den endnu mere lig en ArrayList. Lad os sammenligne:

Kode med ArrayList<String> Kode med HashMap<Integer, String>
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);
}