提供兩種方式實現 Map 依值排序:自訂 Comparator 搭配 TreeMap,以及通用泛型工具方法。
package com.zuidaima.util; import java.util.*; public class ValueComparator implements Comparator{ Map base; public ValueComparator(Map base) { this.base = base; } @Override public int compare(Long a, Long b) { return Double.compare(base.get(b), base.get(a)); // 降序 } // 通用泛型排序方法 public static > Map sortByValues(final Map map) { Comparator valueComparator = (k1, k2) -> { int cmp = map.get(k2).compareTo(map.get(k1)); return cmp == 0 ? 1 : cmp; // 避免值相等時鍵被視為重複 }; Map sorted = new TreeMap<>(valueComparator); sorted.putAll(map); return sorted; } public static void main(String[] args) { Map map = new HashMap<>(); map.put(1L, 99.5); map.put(2L, 67.2); map.put(3L, 67.5); map.put(4L, 67.6); // 方式一:自訂 Comparator TreeMap sorted1 = new TreeMap<>(new ValueComparator(map)); sorted1.putAll(map); System.out.println("results: " + sorted1); // 方式二:通用工具方法 Map sorted2 = sortByValues(map); System.out.println("results2: " + sorted2); } }
unsorted map: {1=99.5, 2=67.2, 3=67.5, 4=67.6}
results: {1=99.5, 4=67.6, 3=67.5, 2=67.2}
results2: {1=99.5, 4=67.6, 3=67.5, 2=67.2}
TreeMap 依鍵排序,透過自訂 Comparator 讓鍵的比較邏輯委派給對應的值。1 而非 0 當值相等時,確保不同鍵不會被視為重複而覆蓋。V extends Comparable,適用於任何可比較的值類型。