Java Map 按值排序
在 Java 中,Map 本身不保证值的顺序,但我们可以通过以下几种方法对 Map 的值进行排序:

方法1:使用 Stream API (Java 8+)
import java.util.*;
import java.util.stream.*;
public class MapSortByValue {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 95);
map.put("Bob", 87);
map.put("Charlie", 92);
map.put("David", 89);
// 按值升序排序
Map<String, Integer> sortedMap = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
System.out.println("升序排序: " + sortedMap);
// 按值降序排序
Map<String, Integer> sortedMapDesc = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
System.out.println("降序排序: " + sortedMapDesc);
}
}
方法2:使用 TreeMap (适用于自然排序)
import java.util.*;
public class TreeMapSort {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 95);
map.put("Bob", 87);
map.put("Charlie", 92);
map.put("David", 89);
// 创建TreeMap并传入自定义比较器
Map<String, Integer> sortedMap = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String k1, String k2) {
return map.get(k1).compareTo(map.get(k2));
}
});
sortedMap.putAll(map);
System.out.println("按值排序: " + sortedMap);
}
}
方法3:使用 List 排序 (适用于所有Java版本)
import java.util.*;
public class ListSort {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 95);
map.put("Bob", 87);
map.put("Charlie", 92);
map.put("David", 89);
// 将Map转换为List
List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
// 对List排序
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
// 将排序后的List放回LinkedHashMap保持顺序
Map<String, Integer> sortedMap = new LinkedHashMap<>();
for (Map.Entry<String, Integer> entry : entries) {
sortedMap.put(entry.getKey(), entry.getValue());
}
System.out.println("按值排序: " + sortedMap);
}
}
注意事项
- 排序后的Map通常使用
LinkedHashMap来保持顺序 - 如果值有重复,排序后的结果可能不稳定
- 对于大型Map,排序操作的时间复杂度为O(n log n)
- 如果Map的值类型不支持自然排序(如自定义对象),需要提供自定义比较器
选择哪种方法取决于你的Java版本和个人偏好,Java 8+的Stream API方法通常是最简洁的。

