Sorter et HashMap i Java

1. Introduktion

I denne hurtige vejledning lærer vi at gøre det sortere en HashMap i Java.

Mere specifikt ser vi på sortering HashMap indtastninger efter deres nøgle eller værdi ved hjælp af:

  • TreeMap
  • ArrayList og Collections.sort ()
  • TreeSet
  • Bruger Strøm API, og endelig,
  • Bruger Guava bibliotek

2. Brug af en TreeMap

Som vi ved, nøgler ind TreeMap sorteres efter deres naturlige rækkefølge. Dette er en god løsning, når vi vil sortere nøgleværdiparene efter deres nøgle. Så ideen er at skubbe alle data fra vores HashMap ind i TreeMap.

Lad os for det første definere en HashMap og initialiser det med nogle data:

Kortkort = nyt HashMap (); Medarbejdermedarbejder1 = ny medarbejder (1L, "Mher"); map.put (medarbejder1.getnavn (), medarbejder1); Medarbejdermedarbejder2 = ny medarbejder (22L, "Annie"); map.put (medarbejder2.getnavn (), medarbejder2); Medarbejdermedarbejder3 = ny medarbejder (8L, "John"); map.put (medarbejder3.getnavn (), medarbejder3); Medarbejdermedarbejder4 = ny medarbejder (2L, "George"); map.put (medarbejder4.getnavn (), medarbejder4);

Til Medarbejder klasse, bemærk, at vi har implementeret Sammenlignelig:

offentlig klasse Medarbejderværktøjer Sammenlignelig {privat Lang id; privat strengnavn; // konstruktør, getters, setter // tilsidesætter lig og hashCode @ Override public int comparTo (Medarbejdermedarbejder) {return (int) (this.id - medarbejder.getId ()); }}

Derefter gemmer vi posterne i TreeMap ved hjælp af sin konstruktør:

TreeMap sorteret = nyt TreeMap (kort);

Eller den sæt alt metode til at kopiere dataene:

TreeMap sorteret = nyt TreeMap (); sorted.putAll (kort);

Og det er det! For at sikre, at vores kortindgange er sorteret efter nøgle, lad os udskrive dem:

Annie = Medarbejder {id = 22, navn = "Annie"} George = Medarbejder {id = 2, navn = "George"} John = Medarbejder {id = 8, navn = "John"} Mher = Medarbejder {id = 1, name = "Mher"}

Som vi ser, er tasterne sorteret i naturlig rækkefølge.

3. Brug ArrayList

Selvfølgelig kan vi sortere posterne på kortet ved hjælp af ArrayList. Hovedforskellen fra den tidligere metode er, at vi opretholder ikke Kort interface her.

3.1. Sorter efter nøgle

Lad os indlæse nøglesættet i et ArrayList:

Liste medarbejderByKey = ny ArrayList (map.keySet ()); Collections.sort (medarbejderByKey);

Og output er:

[Annie, George, John, Mher]

3.2. Sorter efter værdi

Hvad nu hvis vi vil sortere vores kortværdier efter id felt af Medarbejder objekt? Vi kan bruge en ArrayList for det også.

Lad os først kopiere værdierne til listen:

Liste medarbejderById = ny ArrayList (map.values ​​());

Og derefter sorterer vi det:

Collections.sort (medarbejderById);

Husk at dette fungerer fordi Medarbejder implementerer Sammenlignelig interface. Ellers skulle vi definere en manuel komparator til vores opkald til Collections.sort.

For at kontrollere resultaterne udskriver vi medarbejderById:

[Medarbejder {id = 1, navn = "Mher"}, Medarbejder {id = 2, navn = "George"}, Medarbejder {id = 8, navn = "John"}, Medarbejder {id = 22, navn = "Annie "}]

Som vi ser, er objekterne sorteret efter deres id Mark.

4. Brug af en TreeSet

I tilfælde af at vi ikke ønsker at acceptere duplikatværdier i vores sorterede samling, der er en god løsning med TreeSet.

Lad os først tilføje nogle duplikerede poster til vores oprindelige kort:

Medarbejdermedarbejder5 = ny medarbejder (1L, "Mher"); map.put (medarbejder5.getnavn (), medarbejder5); Medarbejdermedarbejder6 = ny medarbejder (22L, "Annie"); map.put (medarbejder6.getnavn (), medarbejder6);

4.1. Sorter efter nøgle

Sådan sorteres kortet efter dets nøgleposter:

SortedSet keySet = nyt TreeSet (map.keySet ());

Lad os udskrive keySet og se output:

[Annie, George, John, Mher]

Nu har vi korttasterne sorteret uden duplikaterne.

4.2. Sorter efter værdi

Ligeledes ser konverteringskoden for kortværdierne ud:

SortedSet-værdier = nyt TreeSet (map.values ​​());

Og resultaterne er:

[Medarbejder {id = 1, navn = "Mher"}, Medarbejder {id = 2, navn = "George"}, Medarbejder {id = 8, navn = "John"}, Medarbejder {id = 22, navn = "Annie "}]

Som vi kan se, er der ingen duplikater i output. Dette fungerer med brugerdefinerede objekter, når vi tilsidesætter lige med og hashCode.

5. Brug af Lambdas og Streams

Siden Java 8 kan vi bruge Stream API og lambda-udtryk til at sortere kortet. Alt, hvad vi har brug for, er at ringe til sorteret metode over kortets strøm rørledning.

5.1. Sorter efter nøgle

For at sortere efter nøgle bruger vi comparingByKey komparator:

map.entrySet () .stream () .sorted (Map.Entry.comparingByKey ()) .forEach (System.out :: println);

Finalen for hver scenen udskriver resultaterne:

Annie = Medarbejder {id = 22, navn = "Annie"} George = Medarbejder {id = 2, navn = "George"} John = Medarbejder {id = 8, navn = "John"} Mher = Medarbejder {id = 1, name = "Mher"}

Som standard er sorteringstilstand stigende.

5.2. Sorter efter værdi

Selvfølgelig kan vi sortere efter Medarbejder genstande også:

map.entrySet () .stream () .sorted (Map.Entry.comparingByValue ()) .forEach (System.out :: println);

Som vi ser, udskriver koden ovenfor et kort sorteret efter id felter af Medarbejder genstande:

Mher = Medarbejder {id = 1, navn = "Mher"} George = Medarbejder {id = 2, navn = "George"} John = Medarbejder {id = 8, navn = "John"} Annie = Medarbejder {id = 22, navn = "Annie"}

Derudover kan vi indsamle resultaterne på et nyt kort:

Kortresultat = map.entrySet () .stream () .sorted (Map.Entry.comparingByValue ()) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, (oldValue, newValue) - > oldValue, LinkedHashMap :: new));

Bemærk, at vi har samlet vores resultater i en LinkedHashMap. Som standard, Collectors.toMap returnerer et nyt HashMap, men som vi ved, HashMap garanterer ikke iterationbestille, mens LinkedHashMap gør.

6. Brug af Guava

Endelig et bibliotek, der giver os mulighed for at sortere HashMap er Guava. Før vi starter, vil det være nyttigt at tjekke vores opskrivning om kort i Guava.

Lad os først erklære en Bestilling som vi vil sortere vores kort efter MedarbejderensId Mark:

Bestilling af naturalOrdering = Ordering.natural () .onResultOf (Functions.forMap (kort, null));

Nu er alt, hvad vi har brug for, at bruge ImmutableSortedMap for at illustrere resultaterne:

ImmutableSortedMap.copyOf (kort, naturlig bestilling);

Og endnu en gang er output et kort bestilt af id Mark:

Mher = Medarbejder {id = 1, navn = "Mher"} George = Medarbejder {id = 2, navn = "George"} John = Medarbejder {id = 8, navn = "John"} Annie = Medarbejder {id = 22, navn = "Annie"}

7. Resume

I denne artikel gennemgik vi en række måder at sortere en HashMap ved nøgle eller værdi.

Og vi kiggede tæt på, hvordan vi kan gøre dette, når attributten er en brugerdefineret klasse ved at implementere Sammenlignelig.

Endelig, som altid, kan koden, der blev brugt under diskussionen, findes på GitHub.