首頁 >Java >java教程 >如何按值而不是鍵對 Java TreeMap 進行排序?

如何按值而不是鍵對 Java TreeMap 進行排序?

Linda Hamilton
Linda Hamilton原創
2024-12-16 19:46:15182瀏覽

How Can I Sort a Java TreeMap by Its Values Instead of Keys?

TreeMap 按值排序

使用 Java 的 TreeMap 時,按鍵的預設自然順序排序可能並不總是足夠的。本文探討了一種根據值對 TreeMap 進行排序的替代方法。

問題描述:

您尋求一種設計比較器的方法,該比較器允許您對TreeMap 按其值而不是預設鍵排序。初始嘗試傳回錯誤,提示有關將 Map.Entry 傳遞給比較器的問題。

解決方案:

雖然無法直接按值對 TreeMap 進行排序,使用外部集合來執行此任務是可行的。透過提取 Map.entrySet(),您可以使用自訂比較器根據條目的值對條目進行排序。

提供的通用方法,entriesSortedByValues(),透過建立 Map.Entry 物件的 SortedSet 來實現此目的。此方法要求映射值是可比較的,並應用比較器來比較這些值以確定條目

實作:

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;  // Handle equal values separately
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}

使用:

    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]"

警告:

修改排序集或其中的 Map.Entry 可能會導致意外結果,因為這不是原始地圖的「視圖」。此外,請注意對 Integer 物件使用 ==,因為它執行參考相等,而不是值相等。

以上是如何按值而不是鍵對 Java TreeMap 進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn