Rendezzen egy HashMap-ot Java-ban

1. Bemutatkozás

Ebben a gyors bemutatóban megtanuljuk, hogyan kell olyasmi HashMap Java-ban.

Pontosabban a válogatást vizsgáljuk meg HashMap bejegyzéseket kulcsuk vagy értékük alapján a következők segítségével:

  • TreeMap
  • Tömb lista és Collections.sort ()
  • TreeSet
  • Használni a Folyam API, és végül,
  • Használni a Gujávafa könyvtár

2. Használja a TreeMap

Mint tudjuk, kulcsok TreeMap természetes rendjük szerint válogatják. Ez jó megoldás, ha a kulcs-érték párokat a kulcsuk szerint akarjuk rendezni. Tehát az ötlet az, hogy minden adatot kitolunk a mi adatunkból HashMap ba,-be TreeMap.

Kezdetnek definiáljuk a HashMap és inicializálja néhány adattal:

Térképtérkép = új HashMap (); Alkalmazott alkalmazott1 = új alkalmazott (1L, "Mher"); map.put (alkalmazott1.getNév (), alkalmazott1); Alkalmazott alkalmazott2 = új alkalmazott (22L, "Annie"); map.put (alkalmazott2.getNév (), alkalmazott2); Alkalmazott alkalmazott3 = új alkalmazott (8L, "John"); map.put (alkalmazott3.getName (), alkalmazott3); Alkalmazott alkalmazott4 = új alkalmazott (2L, "George"); map.put (alkalmazott4.getName (), alkalmazott4);

A Munkavállaló osztály, vegye figyelembe, hogy megvalósítottuk Hasonló:

public class Alkalmazotti eszközök összehasonlítható {private Long id; privát karakterlánc neve; // konstruktor, getters, seters // felülírja az egyenlőt és hashCode @Orride public int CompareTo (Munkavállalói alkalmazott) {return (int) (this.id - alkalmazott.getId ()); }}

Ezután tároljuk a bejegyzéseket a TreeMap konstruktora segítségével:

TreeMap rendezve = new TreeMap (térkép);

Vagy a putAll módszer az adatok másolására:

TreeMap rendezve = new TreeMap (); sorted.putAll (térkép);

És ez az! Annak érdekében, hogy a térképbejegyzéseink kulcsok szerint legyenek rendezve, nyomtassuk ki őket:

Annie = alkalmazott {id = 22, név = "Annie"} George = alkalmazott {id = 2, név = "George"} John = alkalmazott {id = 8, név = "John"} Mher = alkalmazott {id = 1, név = "Mher"}

Mint látjuk, a kulcsok természetes sorrendben vannak rendezve.

3. Használata Tömb lista

Természetesen a térkép bejegyzéseit rendezhetjük a segítségével Tömb lista. A legfontosabb különbség az előző módszerrel szemben az nem tartjuk fenn a Térkép interfész itt.

3.1. Rendezés kulcs szerint

Töltsük be a beállított kulcsot egy Tömb lista:

List workerByKey = new ArrayList (map.keySet ()); Gyűjtemények.rendezés (workerByKey);

És a kimenet:

[Annie, George, John, Mher]

3.2. Rendezés érték szerint

Most mi van, ha a térképi értékeket a id területe Munkavállaló tárgy? Használhatunk egy Tömb lista arra is.

Először másoljuk az értékeket a listába:

List workerById = new ArrayList (map.values ​​());

És ezek után válogatjuk:

Gyűjtemények.rendezés (workerById);

Ne feledje, hogy ez azért működik, mert Munkavállaló végrehajtja a Hasonló felület. Ellenkező esetben meg kell határoznunk egy kézi összehasonlítót a híváshoz Gyűjtemények.rendezés.

Az eredmények ellenőrzéséhez kinyomtatjuk a workerById:

[Alkalmazott {id = 1, név = "Mher"}, Alkalmazott {id = 2, név = "George"}, Alkalmazott {id = 8, név = "John"}, Alkalmazott {id = 22, név = "Annie "}]

Amint látjuk, az objektumok azok szerint vannak rendezve id terület.

4. A TreeSet

Abban az esetben, ha mi ne akarjon duplikált értékeket elfogadni a válogatott gyűjteményünkben, van egy szép megoldás a TreeSet.

Először adjunk hozzá néhány másolatot a kezdeti térképünkhöz:

Alkalmazott alkalmazott5 = új alkalmazott (1L, "Mher"); map.put (alkalmazott5.getName (), alkalmazott5); Alkalmazott alkalmazott6 = új alkalmazott (22L, "Annie"); map.put (alkalmazott6.getName (), alkalmazott6);

4.1. Rendezés kulcs szerint

A térkép fő bejegyzéseinek rendezése:

SortedSet keySet = új TreeSet (map.keySet ());

Nyomtassuk ki a keySet és nézze meg a kimenetet:

[Annie, George, John, Mher]

Most a térképkulcsokat a másolatok nélkül rendeztük.

4.2. Rendezés érték szerint

Hasonlóképpen, a térképi értékek esetében a konverziós kód a következőképpen néz ki:

SortedSet értékek = new TreeSet (map.values ​​());

És az eredmények:

[Alkalmazott {id = 1, név = "Mher"}, Alkalmazott {id = 2, név = "George"}, Alkalmazott {id = 8, név = "John"}, Alkalmazott {id = 22, név = "Annie "}]

Mint láthatjuk, a kimenetben nincsenek másolatok. Ez az egyedi objektumokkal működik, amikor felülírjuk egyenlő és hash kód.

5. Lambdas és Streamek használata

A Java 8 óta használhatjuk a Stream API és a lambda kifejezéseket a térkép rendezéséhez. Csak arra van szükségünk, hogy felhívjuk a válogatott módszer a térképen folyam csővezeték.

5.1. Rendezés kulcs szerint

Kulcs szerinti rendezéshez a összehasonlítvaByKey összehasonlító:

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

A végső az egyes szakasz kinyomtatja az eredményeket:

Annie = Alkalmazott {id = 22, név = "Annie"} George = Alkalmazott {id = 2, név = "George"} John = Alkalmazott {id = 8, név = "John"} Mher = Alkalmazott {id = 1, név = "Mher"}

Alapértelmezés szerint a rendezési mód növekvő.

5.2. Rendezés érték szerint

Természetesen a Munkavállaló tárgyak is:

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

Amint látjuk, a fenti kód kinyomtatja a térképet, a rendezés szerint id mezői Munkavállaló tárgyak:

Mher = Munkavállaló {id = 1, név = "Mher"} George = Munkavállaló {id = 2, név = "George"} John = Munkavállaló {id = 8, név = "John"} Annie = Munkavállaló {id = 22, név = "Annie"}

Ezenkívül összegyűjthetjük az eredményeket egy új térképre:

Térkép eredménye = map.entrySet () .stream () .sorted (Map.Entry.comparingByValue ()) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, (oldValue, newValue) - > oldValue, LinkedHashMap :: new));

Ne feledje, hogy eredményeinket a LinkedHashMap. Alapértelmezés szerint, Gyűjtők.térképbe új HashMap-ot ad vissza, de mint tudjuk, HashMap nem garantálja az iterációtrendelés, míg LinkedHashMap csinál.

6. Guava használata

Végül egy könyvtár, amely lehetővé teszi számunkra a válogatást HashMap az Guava. Mielőtt elkezdenénk, hasznos lesz ellenőrizni a guavai térképekről szóló írásunkat.

Először nyilvánítsunk ki egy Rendelés ahogy rendezni akarjuk a térképünket MunkavállalóiId terület:

Rendelés naturalOrdering = Rendelés.natural () .onResultOf (Functions.forMap (térkép, null));

Most már csak a használatra van szükségünk ImmutableSortedMap az eredmények szemléltetésére:

ImmutableSortedMap.copyOf (térkép, természetesOrdering);

És még egyszer: a kimenet a. Által rendelt térkép id terület:

Mher = Munkavállaló {id = 1, név = "Mher"} George = Munkavállaló {id = 2, név = "George"} John = Munkavállaló {id = 8, név = "John"} Annie = Munkavállaló {id = 22, név = "Annie"}

7. Összegzés

Ebben a cikkben áttekintettük a rendezés számos módját HashMap kulcs vagy érték szerint.

És alaposan megvizsgáltuk, hogyan tehetjük ezt meg, amikor az attribútum egy egyéni osztály a megvalósítással Hasonló.

Végül, mint mindig, a vita során használt kód megtalálható a GitHubon.