HashMap:無序,O(1) 查詢TreeMap:按 Key 自然順序或 Comparator 排序,紅黑樹實現,O(log n)LinkedHashMap:保持插入順序/訪問順序Map 本身不支援按 Value 排序,需轉換為 List/Set 再排序。
// 降序排序 Mapmap = new TreeMap<>((k1, k2) -> k2.compareTo(k1)); map.put("b", "ccccc"); map.put("d", "aaaaa"); map.put("c", "bbbbb"); map.put("a", "ddddd"); // 遍歷輸出:d:aaaaa c:bbbbb b:ccccc a:ddddd map.forEach((k, v) -> System.out.println(k + ":" + v));
public static> Map sortByValue(Map map) { List > list = new ArrayList<>(map.entrySet()); list.sort(Entry.comparingByValue()); // Java 8+ 語法糖 Map result = new LinkedHashMap<>(); for (Map.Entry entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }
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()); // 遍歷 set 即為排序結果
Mapsorted = map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) // 或 .reversed() 降序 .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, // 鍵衝突合併策略 LinkedHashMap::new // 保持順序 ));
| 方案 | 時間複雜度 | 空間 | 適用場景 |
|---|---|---|---|
| TreeMap (Key排序) | O(n log n) | O(n) | 需保持鍵有序的場景 |
| List+Collections.sort | O(n log n) | O(n) | 通用 Value 排序,兼容性最好 |
| TreeSet | O(n log n) | O(n) | 需去重 Value 相同鍵 |
| Stream API | O(n log n) | O(n) | Java 8+ 項目,代碼最簡潔 |
Comparable 或提供 ComparatorLinkedHashMap 承接,否則順序會丟失