Rumah > Java > javaTutorial > Bagaimanakah Saya Boleh Isih Peta Pokok mengikut Nilainya, Bukan Kekunci?

Bagaimanakah Saya Boleh Isih Peta Pokok mengikut Nilainya, Bukan Kekunci?

Linda Hamilton
Lepaskan: 2024-12-23 05:59:23
asal
145 orang telah melayarinya

How Can I Sort a TreeMap by its Values, Not Keys?

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;
        }
    }
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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]"
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan