Urutkan HashMap di Java

1. Perkenalan

Dalam tutorial singkat ini, kita akan belajar bagaimana mengurutkan HashMap di Java .

Lebih khusus lagi, kita akan melihat pengurutan entri HashMap berdasarkan kunci atau nilainya menggunakan:

  • TreeMap
  • ArrayList dan Collections.sort ()
  • TreeSet
  • Menggunakan API Stream , dan terakhir,
  • Menggunakan pustaka Guava

2. Menggunakan TreeMap

Seperti yang kita ketahui, kunci di TreeMap diurutkan menggunakan urutan aslinya . Ini adalah solusi yang bagus ketika kita ingin mengurutkan pasangan nilai kunci berdasarkan kuncinya. Jadi idenya adalah untuk mendorong semua data dari HashMap kami ke TreeMap .

Sebagai permulaan, mari kita tentukan HashMap dan inisialisasi dengan beberapa data:

Map map = new HashMap(); Employee employee1 = new Employee(1L, "Mher"); map.put(employee1.getName(), employee1); Employee employee2 = new Employee(22L, "Annie"); map.put(employee2.getName(), employee2); Employee employee3 = new Employee(8L, "John"); map.put(employee3.getName(), employee3); Employee employee4 = new Employee(2L, "George"); map.put(employee4.getName(), employee4);

Untuk kelas Karyawan , perhatikan bahwa kami telah menerapkan Comparable :

public class Employee implements Comparable { private Long id; private String name; // constructor, getters, setters // override equals and hashCode @Override public int compareTo(Employee employee) { return (int)(this.id - employee.getId()); } }

Selanjutnya, kami menyimpan entri di TreeMap dengan menggunakan konstruktornya:

TreeMap sorted = new TreeMap(map);

Atau, metode putAll untuk menyalin data:

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

Dan itu dia! Untuk memastikan entri peta kita diurutkan berdasarkan kunci, mari kita cetak:

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

Seperti yang kita lihat, kunci diurutkan dalam urutan alami.

3. Menggunakan ArrayList

Tentu saja, kita dapat mengurutkan entri peta dengan bantuan ArrayList . Perbedaan utama dari metode sebelumnya adalah kami tidak memelihara antarmuka Peta di sini .

3.1. Sortir menurut Kunci

Mari memuat set kunci ke dalam ArrayList :

List employeeByKey = new ArrayList(map.keySet()); Collections.sort(employeeByKey);

Dan hasilnya adalah:

[Annie, George, John, Mher]

3.2. Urutkan berdasarkan Nilai

Sekarang, bagaimana jika kita ingin mengurutkan nilai peta kita berdasarkan field id objek Employee ? Kita juga bisa menggunakan ArrayList untuk itu.

Pertama, mari salin nilainya ke dalam daftar:

List employeeById = new ArrayList(map.values());

Dan setelah itu, kami mengurutkannya:

Collections.sort(employeeById);

Ingatlah bahwa ini berfungsi karena Employee mengimplementasikan antarmuka Comparable . Jika tidak, kita perlu mendefinisikan komparator manual untuk panggilan kita ke Collections.sort .

Untuk memeriksa hasilnya, kami mencetak employeeById :

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

Seperti yang kita lihat, objek diurutkan berdasarkan bidang id mereka .

4. Menggunakan TreeSet

Jika kami tidak ingin menerima nilai duplikat dalam koleksi yang kami sortir, ada solusi bagus dengan TreeSet.

Pertama, mari tambahkan beberapa entri duplikat ke peta awal kita:

Employee employee5 = new Employee(1L, "Mher"); map.put(employee5.getName(), employee5); Employee employee6 = new Employee(22L, "Annie"); map.put(employee6.getName(), employee6);

4.1. Sortir menurut Kunci

Untuk mengurutkan peta berdasarkan entri kuncinya:

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

Mari kita cetak keySet dan lihat hasilnya:

[Annie, George, John, Mher]

Sekarang kita memiliki kunci peta yang diurutkan tanpa duplikatnya.

4.2. Urutkan berdasarkan Nilai

Begitu juga untuk nilai peta, kode konversinya terlihat seperti:

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

Dan hasilnya adalah:

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

Seperti yang bisa kita lihat, tidak ada duplikat di output. Ini berfungsi dengan objek khusus saat kita mengganti sama dengan dan kode hash.

5. Menggunakan Lambdas dan Streams

Sejak Java 8, kita dapat menggunakan Stream API dan ekspresi lambda untuk mengurutkan peta . Yang kita butuhkan hanyalah memanggil metode yang diurutkan melalui pipa aliran peta .

5.1. Sortir menurut Kunci

Untuk mengurutkan berdasarkan kunci, kami menggunakan pembanding CompareByKey:

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

Tahap final forEach mencetak hasil:

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

Secara default, mode pengurutan adalah menaik.

5.2. Urutkan berdasarkan Nilai

Tentu saja, kami juga dapat mengurutkan berdasarkan objek Employee :

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

As we see, the code above prints out a map sorted by the id fields of Employee objects:

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

Additionally, we can collect the results into a new map:

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

Note that we collected our results into a LinkedHashMap. By default, Collectors.toMap returns a new HashMap, but as we know, HashMap doesn't guarantee iterationorder, while LinkedHashMap does.

6. Using Guava

Lastly, a library that allows us to sort the HashMap is Guava. Before we start, it'll be useful to check our write-up about maps in Guava.

Pertama, mari nyatakan Pengurutan karena kita ingin mengurutkan peta kita berdasarkan bidang Id Karyawan :

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

Sekarang, yang kita butuhkan hanyalah menggunakan ImmutableSortedMap untuk mengilustrasikan hasil:

ImmutableSortedMap.copyOf(map, naturalOrdering);

Dan sekali lagi, hasilnya adalah peta yang diurutkan berdasarkan kolom id :

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

7. Ringkasan

Dalam artikel ini, kami meninjau sejumlah cara untuk mengurutkan HashMap berdasarkan kunci atau nilai.

Dan kami mencermati bagaimana kami dapat melakukan ini jika atributnya adalah kelas khusus dengan mengimplementasikan Comparable .

Terakhir, seperti biasa, kode yang digunakan selama diskusi dapat ditemukan di GitHub.