Map 針對 Key 排序(TreeMap),但無直接按 Value 排序能力。核心思路:**將 EntrySet 轉為可排序集合,排序後重建有序 Map**。
class Pair implements Comparable{ String key; int value; // 構造器、getter @Override public int compareTo(Pair o) { int cmp = Integer.compare(value, o.value); return cmp != 0 ? cmp : key.compareTo(o.key); // 值相同按鍵排序 } } // 使用 Set set = new TreeSet<>(); set.add(new Pair("me", 1000)); set.add(new Pair("and", 4000)); // 遍歷 set 即有序
優點:插入即有序;缺點:需自定義類,Value 相同鍵會去重。
List> list = new ArrayList<>(map.entrySet()); list.sort((e1, e2) -> e1.getValue().compareTo(e2.getValue())); // 升序 Map sorted = new LinkedHashMap<>(); for (Map.Entry e : list) { sorted.put(e.getKey(), e.getValue()); }
優點:無需額外類,保留所有鍵,兼容所有 JDK 版本。
Set> set = new TreeSet<>((e1, e2) -> { int cmp = e2.getValue().compareTo(e1.getValue()); // 值降序 return cmp != 0 ? cmp : e2.getKey().compareTo(e1.getKey()); }); set.addAll(map.entrySet());
Mapsorted = map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) // .reversed() 降序 .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, // 鍵衝突合併(理論上不發生) LinkedHashMap::new // 關鍵:保持插入順序 ));
// Groovy 1.6+
def result = map.sort { a, b -> b.value.compareTo(a.value) }
// Python
sorted(map.items(), key=lambda kv: kv[1], reverse=True)
| 陷阱 | 後果 | 解決 |
|---|---|---|
| 用 HashMap 接收排序結果 | 順序丟失 | 必須用 LinkedHashMap |
| Value 為 null | NPE | 預處理或 Comparator.nullsFirst/Last |
| Value 非 Comparable | ClassCastException | 提供 Comparator 或轉換為可比較類型 |
| Value 相同鍵去重 | 數據丟失 | 用 List 方案或 Comparator 加入鍵比較 |
LinkedHashMap::new