1. 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 Set
samlingen, men det gemmer et sæt "par" af elementer i stedet for et sæt elementer. Hvert par i a Map
bestå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. HashMap
klasse
Klassen HashMap
er den mest populære form for Map
samling. 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 HashMap
ved hjælp af en erklæring som denne:
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
Hvor KeyType
er typen af nøglerne i de lagrede par, og ValueType
er typen af værdierne i parrene gemt i HashMap
samlingen.
Klassen HashMap
har metoder som denne:
Metode | Beskrivelse |
---|---|
|
Tilføjer ( key , value ) parret til samlingen |
|
Returnerer den værdi, der er knyttet til en nøgle. |
|
Kontrollerer, om der findes en nøgle i samlingen |
|
Kontrollerer, om der findes en værdi i samlingen |
|
Fjerner et element fra samlingen |
|
Rydder samlingen og fjerner alle elementer |
|
Returnerer antallet af nøgleværdi-par i samlingen |
|
Returnerer nøglesættet i samlingen |
|
Returnerer et sæt, der indeholder elementerne i samlingen |
|
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 HashMap
like til en matrix eller en liste, hvis indeks er ord ( String
) i stedet for tal.
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 HashMap
på 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
HashMap
indgange 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 |
---|---|
|
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 |
---|---|
|
|
4. Looping over nøgleværdi-par
Der er også en mere kompliceret måde: du kan transformere a Map
til et sæt nøgleværdi-par og derefter loope over elementerne i sættet, som vi allerede har lært.
Samlingen HashMap
har 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 Set
klasse 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 entries
og i stedet kalde entrySet()
metoden direkte inde i for
lø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 var
operator 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 ArrayList
ogHashMap
A HashMap
minder meget om en ArrayList
, der tillader strenge (eller andre typer) at blive brugt som indekser (nøglerne).
Hvis du bruger Integer
til tasterne i en HashMap
, så bliver den endnu mere lig en ArrayList
. Lad os sammenligne:
Kode med ArrayList<String> | Kode med HashMap<Integer, String> |
---|---|
|
|
GO TO FULL VERSION