Triedenie HashMap v Jave

1. Úvod

V tomto rýchlom výučbe sa dozvieme, ako na to triediť a HashMap v Jave.

Konkrétnejšie sa pozrieme na triedenie HashMap položky podľa ich kľúča alebo hodnoty pomocou:

  • TreeMap
  • ArrayList a Zbierka.sort ()
  • TreeSet
  • Pomocou Prúd API, a nakoniec,
  • Pomocou Guava knižnica

2. Pomocou a TreeMap

Ako vieme, kľúče v TreeMap sú zoradené podľa ich prirodzeného poradia. Toto je dobré riešenie, keď chceme triediť páry kľúč - hodnota podľa ich kľúča. Ide teda o to, vytlačiť všetky údaje z našej HashMap do TreeMap.

Pre začiatočníkov definujme a HashMap a inicializujte ho nejakými údajmi:

Mapová mapa = nová HashMap (); Zamestnanec zamestnanec1 = nový zamestnanec (1L, „Mher“); map.put (employee1.getName (), employee1); Zamestnanec zamestnanec2 = nový zamestnanec (22L, "Annie"); map.put (employee2.getName (), employee2); Zamestnanec zamestnanec3 = nový zamestnanec (8L, „John“); map.put (employee3.getName (), employee3); Zamestnanec zamestnanec4 = nový zamestnanec (2L, „George“); map.put (employee4.getName (), employee4);

Pre Zamestnanec trieda, Všimnite si, že sme implementovali Porovnateľné:

public class Zamestnanec implementuje Porovnateľné {private Long id; súkromné ​​meno reťazca; // konštruktor, getri, nastavovatelia // prepísať rovný a hashCode @Override public int compareTo (zamestnanec zamestnanca) {return (int) (this.id - employee.getId ()); }}

Ďalej uložíme položky do TreeMap pomocou jeho konštruktora:

TreeMap triedený = nový TreeMap (mapa);

Alebo putAll spôsob kopírovania údajov:

TreeMap triedený = nový TreeMap (); triedené.putAll (mapa);

A je to! Aby sme sa ubezpečili, že sú naše záznamy na mape zoradené podľa kľúča, vytlačme si ich:

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

Ako vidíme, kľúče sú zoradené v prirodzenom poradí.

3. Používanie ArrayList

Položky na mape môžeme samozrejme triediť pomocou ArrayList. Kľúčový rozdiel od predchádzajúcej metódy je v tom neudržiavame Mapa rozhranie tu.

3.1. Zoradiť podľa kľúča

Načítajme sadu kľúčov do ArrayList:

Zoznam zamestnancaByKey = nový ArrayList (map.keySet ()); Zbierka.sort (zamestnanecByKey);

A výstup je:

[Annie, George, John, Mher]

3.2. Zoradiť podľa hodnoty

Čo teraz, ak chceme zoradiť naše hodnoty mapy podľa id oblasť Zamestnanec objekt? Môžeme použiť ArrayList aj za to.

Najskôr skopírujte hodnoty do zoznamu:

Zoznam zamestnancaById = nový ArrayList (map.values ​​());

A potom to zoradíme:

Collections.sort (employeeById);

Pamätajte, že to funguje, pretože Zamestnanec realizuje Porovnateľné rozhranie. V opačnom prípade by sme pre našu výzvu museli definovať manuálny komparátor Zbierky.triediť.

Na kontrolu výsledkov vytlačíme employeeById:

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

Ako vidíme, objekty sú zoradené podľa nich id lúka.

4. Pomocou a TreeSet

V prípade, že by sme Nechcem akceptovať duplicitné hodnoty v našom triedenom zbere, existuje pekné riešenie s TreeSet.

Najprv do našej pôvodnej mapy pridáme duplicitné položky:

Zamestnanec zamestnanec5 = nový zamestnanec (1L, „Mher“); map.put (employee5.getName (), employee5); Zamestnanec zamestnanec6 = nový zamestnanec (22L, "Annie"); map.put (zamestnanec6.getName (), zamestnanec6);

4.1. Zoradiť podľa kľúča

Zoradenie mapy podľa jej kľúčových položiek:

SortedSet keySet = nový TreeSet (map.keySet ());

Poďme si vytlačiť keySet a pozri výstup:

[Annie, George, John, Mher]

Teraz máme kľúče mapy zoradené bez duplikátov.

4.2. Zoradiť podľa hodnoty

Rovnako pre hodnoty mapy vyzerá konverzný kód takto:

Hodnoty SortedSet = nový TreeSet (map.values ​​());

A výsledky sú:

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

Ako vidíme, na výstupe nie sú žiadne duplikáty. Toto funguje s vlastnými objektmi, keď ich prepíšeme rovná sa a hashCode.

5. Používanie lambd a prúdov

Od verzie Java 8 môžeme na triedenie mapy používať výrazy Stream API a lambda. Všetko, čo potrebujeme, je zavolať na zoradené metóda nad mapou Prúd potrubie.

5.1. Zoradiť podľa kľúča

Na triedenie podľa kľúča používame porovnanieByKey komparátor:

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

Finálny pre každý fáza vytlačí výsledky:

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

Predvolene je režim triedenia vzostupný.

5.2. Zoradiť podľa hodnoty

Samozrejme, môžeme triediť podľa Zamestnanec predmety tiež:

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

Ako vidíme, vyššie uvedený kód vytlačí mapu zoradenú podľa id polia Zamestnanec objekty:

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

Ďalej môžeme zhromaždiť výsledky do novej mapy:

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

Upozorňujeme, že sme zhromaždili naše výsledky do a LinkedHashMap. Predvolene, Collectors.toMap vráti novú HashMapu, ale ako vieme, HashMap nezaručuje iteráciuobjednať, zatiaľ čo LinkedHashMap robí.

6. Používanie Guavy

Na záver knižnica, ktorá nám umožňuje triediť súbory HashMap je Guava. Než začneme, bude užitočné skontrolovať si náš zápis o mapách na Guave.

Najprv vyhlásime Objednávanie pretože chceme roztriediť našu mapu ZamestnanecId lúka:

Objednávka naturalOrdering = Ordering.natural () .onResultOf (Functions.forMap (mapa, null));

Všetko, čo potrebujeme, je použiť ImmutableSortedMap na ilustráciu výsledkov:

ImmutableSortedMap.copyOf (mapa, naturalOrdering);

Výstupom je opäť mapa zoradená podľa id lúka:

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

7. Zhrnutie

V tomto článku sme preskúmali niekoľko spôsobov zoradenia a HashMap podľa kľúča alebo podľa hodnoty.

A podrobne sme sa pozreli na to, ako to môžeme urobiť, keď je implementáciou implementácia atribútu vlastná trieda Porovnateľné.

Nakoniec, ako vždy, kód použitý počas diskusie nájdete na GitHub.


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