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 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 |
|---|---|
|
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 HashMaplike 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 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 |
|---|---|
|
Sløjfe over tasterne på den mapHent 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 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> |
|---|---|
|
|
GO TO FULL VERSION