Isih Peta Pokok mengikut Nilai
Peta Pokok ialah peta yang diisih di mana kekunci diisih mengikut tertib menaik mengikut susunan semula jadinya. Jika pengisihan tersuai diperlukan berdasarkan nilai, anda perlu menggunakan pembanding yang menilai nilai sebaliknya.
Satu percubaan untuk melaksanakan pembanding sedemikian mungkin kelihatan seperti ini:
class byValue implements Comparator<Map.Entry<String, Integer>> { public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) { if (e1.getValue() < e2.getValue()) { return 1; } else if (e1.getValue() == e2.getValue()) { return 0; } else { return -1; } } }
Walau bagaimanapun, pendekatan ini adalah cacat kerana TreeMap tidak boleh mengisih berdasarkan nilai semata-mata. Ia direka bentuk untuk mengisih kekuncinya, bukan nilai yang dikaitkan dengan kekunci tersebut.
Penyelesaian Alternatif: Isih Peta.Entri
Untuk mengatasi had ini, koleksi luaran boleh digunakan untuk mengisih koleksi Map.entrySet(). Set diisih ini membenarkan penapisan dan pengisihan berdasarkan nilai. Berikut ialah kaedah generik yang mengisih Map.entrySet() mengikut nilai:
static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) { SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>( new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) { int res = e1.getValue().compareTo(e2.getValue()); return res != 0 ? res : 1; } } ); sortedEntries.addAll(map.entrySet()); return sortedEntries; }
Menggunakan kaedah ini, satu set Map.Entri yang diisih boleh diperoleh berdasarkan nilai, seperti yang ditunjukkan di bawah:
Map<String, Integer> map = new TreeMap<>(); map.put("A", 3); map.put("B", 2); map.put("C", 1); System.out.println(map); // prints "{A=3, B=2, C=1}" System.out.println(entriesSortedByValues(map)); // prints "[C=1, B=2, A=3]"
Nota tentang Kesamaan Integer
Memang berbaloi mengambil perhatian bahawa kod yang disediakan menggunakan == untuk membandingkan nilai Integer. Ini biasanya tidak disyorkan kerana ia menyemak kesamaan rujukan, bukan kesamaan nilai. Dalam sesetengah senario, ia mungkin membawa kepada hasil yang tidak dijangka. Adalah lebih baik untuk menggunakan kaedah seperti compareTo() untuk perbandingan nilai sebaliknya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Isih Peta Pokok mengikut Nilainya, Bukan Kekunci?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!