Sorter et HashMap i Java

1. Introduksjon

I denne raske opplæringen lærer vi hvordan du gjør det sorter en HashMap i Java.

Mer spesifikt vil vi se på sortering HashMap oppføringer etter nøkkel eller verdi ved hjelp av:

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

2. Bruke en TreeMap

Som vi vet, tastene inn TreeMap sorteres etter deres naturlige rekkefølge. Dette er en god løsning når vi vil sortere nøkkelverdiparene etter nøkkelen. Så ideen er å skyve all data fra vår HashMap inn i det TreeMap.

For det første, la oss definere en HashMap og initialiser den med noen data:

Kartkart = nytt HashMap (); Ansatt ansatt1 = ny ansatt (1L, "Mher"); map.put (ansatt1.getnavn (), ansatt1); Ansatt ansatt2 = ny ansatt (22L, "Annie"); map.put (medarbeider2.getnavn (), ansatt2); Ansatt ansatt3 = ny ansatt (8L, "John"); map.put (ansatt3.getnavn (), ansatt3); Ansatt ansatt4 = ny ansatt (2L, "George"); map.put (ansatt4.getnavn (), ansatt4);

For Ansatt klasse, Vær oppmerksom på at vi har implementert Sammenlignelig:

offentlig klasse Medarbeidere implementerer Sammenlignelig {privat Lang id; privat strengnavn; // constructor, getters, setters // override equals and hashCode @Override public int compareTo (Employee ansatte) {return (int) (this.id - employee.getId ()); }}

Deretter lagrer vi oppføringene i TreeMap ved å bruke sin konstruktør:

TreeMap sorted = new TreeMap (map);

Eller putt alle metode for å kopiere dataene:

TreeMap sorted = new TreeMap (); sorted.putAll (kart);

Og det er det! For å sikre at kartoppføringene våre er sortert etter nøkkel, la oss skrive dem ut:

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

Som vi ser, er tastene sortert i naturlig rekkefølge.

3. Bruke ArrayList

Selvfølgelig kan vi sortere oppføringene på kartet ved hjelp av ArrayList. Hovedforskjellen fra den forrige metoden er at vi vedlikeholder ikke Kart grensesnitt her.

3.1. Sorter etter nøkkel

La oss laste nøkkelsettet inn i et ArrayList:

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

Og produksjonen er:

[Annie, George, John, Mher]

3.2. Sorter etter verdi

Nå, hva om vi vil sortere kartverdiene etter id innen Ansatt gjenstand? Vi kan bruke en ArrayList for det også.

La oss først kopiere verdiene til listen:

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

Og etter det sorterer vi det:

Collections.sort (employeeById);

Husk at dette fungerer fordi Ansatt implementerer Sammenlignelig grensesnitt. Ellers må vi definere en manuell komparator for vår samtale til Collections.sort.

For å sjekke resultatene skriver vi ut ansatteById:

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

Som vi ser er objektene sortert etter deres id felt.

4. Bruke en TreeSet

I tilfelle vi ikke vil godta dupliserte verdier i den sorterte samlingen vår, det er en fin løsning med TreeSet.

La oss først legge til noen dupliserte oppføringer på vårt første kart:

Ansatt ansatt5 = ny ansatt (1L, "Mher"); map.put (ansatt5.getnavn (), ansatt5); Ansatt ansatt6 = ny ansatt (22L, "Annie"); map.put (medarbeider6.getnavn (), ansatt6);

4.1. Sorter etter nøkkel

Slik sorterer du kartet etter nøkkeloppføringene:

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

La oss skrive ut keySet og se utgangen:

[Annie, George, John, Mher]

Nå har vi karttastene sortert uten duplikatene.

4.2. Sorter etter verdi

På samme måte ser konverteringskoden ut for kartverdiene:

SortedSet-verdier = nytt TreeSet (map.values ​​());

Og resultatene er:

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

Som vi kan se, er det ingen duplikater i utdataene. Dette fungerer med egendefinerte objekter når vi overstyrer er lik og hashCode.

5. Bruke Lambdas og Streams

Siden Java 8 kan vi bruke Stream API og lambda-uttrykk for å sortere kartet. Alt vi trenger er å ringe sortert metoden over kartets strøm rørledning.

5.1. Sorter etter nøkkel

For å sortere etter nøkkel bruker vi comparingByKey komparator:

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

Finalen for hver scenen skriver ut resultatene:

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

Som standard er sorteringsmodus stigende.

5.2. Sorter etter verdi

Selvfølgelig kan vi sortere etter Ansatt gjenstander også:

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

Som vi ser, skriver koden over ut et kart sortert etter id felt av Ansatt gjenstander:

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

I tillegg kan vi samle resultatene på et nytt kart:

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

Merk at vi samlet resultatene våre i en LinkedHashMap. Som standard, Collectors.toMap returnerer et nytt HashMap, men som vi vet, HashMap garanterer ikke iterasjonrekkefølge, samtidig som LinkedHashMap gjør.

6. Bruke Guava

Til slutt et bibliotek som lar oss sortere HashMap er Guava. Før vi begynner, vil det være nyttig å sjekke om vi skriver om kart i Guava.

La oss først erklære en Bestilling som vi ønsker å sortere kartet vårt etter AnsattesId felt:

Ordering naturalOrdering = Ordering.natural () .onResultOf (Functions.forMap (map, null));

Nå er alt vi trenger å bruke ImmutableSortedMap for å illustrere resultatene:

ImmutableSortedMap.copyOf (kart, naturlig bestilling);

Og nok en gang er utdataene et kart bestilt av id felt:

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

7. Oppsummering

I denne artikkelen gjennomgikk vi en rekke måter å sortere en på HashMap med nøkkel eller etter verdi.

Og vi tok en nærmere titt på hvordan vi kan gjøre dette når attributtet er en tilpasset klasse ved å implementere Sammenlignelig.

Til slutt, som alltid, finner du koden som ble brukt under diskusjonen på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found