Få den første nøkkelen og verdien fra et HashMap
1. Oversikt
I denne opplæringen vil vi diskutere hvordan du får det første nøkkelverdiparet fra en HashMap uten å vite nøkkelen.
Først bruker vi en iterator, og deretter en strøm for å få den første oppføringen. Til slutt vil vi diskutere et problem HashMap presenterer når vi ønsker å få den første oppføringen og hvordan vi skal løse den.
2. Bruke en Iterator
La oss vurdere at vi har følgende HashMap:
Kart hashMap = nytt HashMap (); hashMap.put (5, "A"); hashMap.put (1, "B"); hashMap.put (2, "C");
I dette eksemplet bruker vi en iterator for å få det første nøkkelverdiparet. Så la oss lage en iterator på oppføringssett av HashMap og ring neste () metode for å hente den første oppføringen:
Iterator iterator = hashMap.entrySet (). iterator (); Map.Entry actualValue = iterator.next (); Map.Entry expectValue = new AbstractMap.SimpleEntry (1, "B"); assertEquals (forventet verdi, faktisk verdi);
3. Bruke en Java Stream
En annen tilnærming er å bruke Java Stream API. La oss lage en strøm på oppføringssett og ring findFirst () metode for å få sin første oppføring:
Map.Entry actualValue = hashMap.entrySet () .stream () .findFirst () .get ();
Map.Entry expectValue = new AbstractMap.SimpleEntry (1, "B"); assertEquals (forventet verdi, faktisk verdi);
4. Problem med innsettingsordren
For å presentere dette problemet, la oss huske hvordan vi opprettet hashMap, paret 5 = A ble satt inn som første oppføring, da 1 = B og endelig 2 = C. La oss sjekke dette ved å skrive ut innholdet på vårt HashMap:
System.out.println (hashMap);
{1 = B, 2 = C, 5 = A}
Som vi kan se, er ikke bestilling det samme. De HashMap-klasse implementering garanterer ikke innsettingsordren.
La oss nå legge til ett element til hashMap:
hashMap.put (0, "D"); Iterator iterator = hashMap.entrySet (). iterator (); Map.Entry actualValue = iterator.next (); Map.Entry expectValue = new AbstractMap.SimpleEntry (0, "D"); assertEquals (forventet verdi, faktisk verdi);
Som vi kan se, har den første oppføringen endret seg igjen (til 0 = D i dette tilfellet). Dette beviser også det HashMap garanterer ikke en innsettingsordre.
Så, hvis vi ønsker å bevare ordren, bør vi bruke en LinkedHashMap i stedet:
Map linkedHashMap = new LinkedHashMap (); linkedHashMap.put (5, "A"); linkedHashMap.put (1, "B"); linkedHashMap.put (2, "C"); linkedHashMap.put (0, "D"); Iterator iterator = linkedHashMap.entrySet (). iterator (); Map.Entry actualValue = iterator.next (); Map.Entry expectValue = new AbstractMap.SimpleEntry (5, "A"); assertEquals (forventet verdi, faktisk verdi);
5. Konklusjon
I denne korte artikkelen diskuterte vi forskjellige tilnærminger for å få den første oppføringen fra a HashMap.
Det viktigste punktet å merke seg er at HashMap implementering garanterer ikke noen rekkefølge for innsetting. Så hvis vi er interessert i å bevare innsettingsordren, bør vi bruke en LinkedHashMap.
Kodeeksemplet er tilgjengelig på GitHub.