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

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

Linda Hamilton
Linda Hamilton原創
2024-12-23 05:59:23193瀏覽

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

按值對 TreeMap 進行排序

TreeMap 是排序映射,其中鍵按自然順序升序排序。如果需要根據值進行自訂排序,則需要使用評估值的比較器。

實作此類比較器的一次嘗試可能如下所示:

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

然而,這種方法是有缺陷的,因為 TreeMap 不能僅根據值進行排序。它旨在對其鍵進行排序,而不是與這些鍵關聯的值。

替代解決方案:排序 Map.Entry

要克服此限制,可以使用外部集合用於對 Map.entrySet() 集合進行排序。此排序集允許根據值進行過濾和排序。以下是按值對Map.entrySet() 進行排序的通用方法:

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

使用此方法,可以根據值取得經過排序的Map.Entries 集合,如下所示:

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

整數相等的注意事項

值得請注意,提供的程式碼使用== 來比較整數值。通常不建議這樣做,因為它檢查引用相等性,而不是值相等性。在某些情況下,可能會導致意想不到的結果。最好使用compareTo()之類的方法來進行值比較。

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

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