Susun HashMap di Java

1. Pengenalan

Dalam tutorial ringkas ini, kita akan belajar bagaimana menyusun HashMap di Java .

Lebih khusus lagi, kami akan melihat menyusun entri HashMap mengikut kunci atau nilai mereka menggunakan:

  • Peta Pokok
  • ArrayList and Collections.sort ()
  • Set Pokok
  • Menggunakan Stream API , dan akhirnya,
  • Menggunakan perpustakaan Jambu Batu

2. Menggunakan Peta Pokok

Seperti yang kita ketahui, kunci dalam TreeMap disusun menggunakan urutan semula jadi . Ini adalah penyelesaian yang baik apabila kita mahu menyusun pasangan nilai-kunci dengan kunci mereka. Jadi idenya adalah untuk memasukkan semua data dari HashMap kami ke dalam TreeMap .

Sebagai permulaan, mari kita tentukan HashMap dan memulakannya 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 Pekerja , perhatikan bahawa kami telah melaksanakan Sebanding :

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()); } }

Seterusnya, kami menyimpan entri di TreeMap dengan menggunakan konstruktornya:

TreeMap sorted = new TreeMap(map);

Atau, kaedah putAll untuk menyalin data:

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

Dan itu sahaja! Untuk memastikan entri peta kami disusun mengikut kunci, mari mencetaknya:

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 disusun mengikut urutan semula jadi.

3. Menggunakan ArrayList

Sudah tentu, kita dapat menyusun entri peta dengan bantuan ArrayList . Perbezaan utama dari kaedah sebelumnya adalah bahawa kita tidak mengekalkan antara muka Peta di sini .

3.1. Isih mengikut Kunci

Mari muatkan set kunci ke ArrayList :

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

Dan outputnya adalah:

[Annie, George, John, Mher]

3.2. Isih mengikut Nilai

Sekarang, bagaimana jika kita mahu menyusun nilai peta kita dengan medan id objek Pekerja ? Kami juga boleh menggunakan ArrayList untuk itu.

Pertama, mari salin nilai ke dalam senarai:

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

Dan selepas itu, kami menyusunnya:

Collections.sort(employeeById);

Ingat bahawa ini berfungsi kerana Pekerja menggunakan antara muka yang boleh dibandingkan . Jika tidak, kita perlu menentukan pembanding manual untuk panggilan kita ke Collections.sort .

Untuk memeriksa hasilnya, kami mencetak pekerjaById :

[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 disusun mengikut bidang id mereka .

4. Menggunakan TreeSet

Sekiranya kami tidak mahu menerima nilai pendua dalam koleksi kami yang disusun, ada penyelesaian yang bagus dengan TreeSet.

Pertama, mari tambah beberapa entri pendua ke peta awal kami:

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

4.1. Isih mengikut Kunci

Untuk menyusun peta mengikut entri utamanya:

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

Mari cetak keySet dan lihat keluarannya:

[Annie, George, John, Mher]

Sekarang kita mempunyai kunci peta yang disusun tanpa pendua.

4.2. Isih mengikut Nilai

Begitu juga, untuk nilai peta, kod penukaran kelihatan 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 kita lihat, tidak ada pendua dalam output. Ini berfungsi dengan objek tersuai ketika kita menimpa sama dan hashCode.

5. Menggunakan Lambdas dan Aliran

Sejak Java 8, kita dapat menggunakan Stream API dan ekspresi lambda untuk menyusun peta . Apa yang kita perlukan adalah untuk memanggil disusun kaedah atas peta ini aliran saluran paip.

5.1. Isih mengikut Kunci

Untuk menyusun mengikut kunci, kami menggunakan pembandingByKey yang membandingkan :

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

Akhir foreach cetakan peringkat keluar keputusan:

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 lalai, mod pengurutan meningkat.

5.2. Isih mengikut Nilai

Sudah tentu, kita boleh menyusun objek Kakitangan juga:

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 Pemesanan kerana kami ingin menyusun peta kami mengikut medan Id Pekerja :

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

Sekarang, yang kita perlukan adalah menggunakan ImmutableSortedMap untuk menggambarkan hasilnya:

ImmutableSortedMap.copyOf(map, naturalOrdering);

Dan sekali lagi, output adalah peta yang diperintahkan oleh medan 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 mengkaji beberapa cara untuk menyusun HashMap mengikut kunci atau nilai.

Dan kami melihat dengan teliti bagaimana kami dapat melakukan ini ketika atribut adalah kelas khusus dengan menerapkan Comparable .

Akhirnya, seperti biasa, kod yang digunakan semasa perbincangan boleh didapati di GitHub.