很少有Java示例通过其键或值对Map进行排序。
注意 如果您使用的是Java 8,请参阅本文– 如何使用流API对地图进行排序
1.按键排序
1.1使用java.util.TreeMap ,它将自动按键对Map进行排序。
SortByKeyExample1.java
package com.mkyong.test;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class SortByKeyExample1 {
public static void main(String[] args) {
Map unsortMap = new HashMap();
unsortMap.put("Z", "z");
unsortMap.put("B", "b");
unsortMap.put("A", "a");
unsortMap.put("C", "c");
unsortMap.put("D", "d");
unsortMap.put("E", "e");
unsortMap.put("Y", "y");
unsortMap.put("N", "n");
unsortMap.put("J", "j");
unsortMap.put("M", "m");
unsortMap.put("F", "f");
System.out.println("Unsort Map......");
printMap(unsortMap);
System.out.println("\nSorted Map......By Key");
Map treeMap = new TreeMap(unsortMap);
printMap(treeMap);
}
//pretty print a map
public static void printMap(Map map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey()
+ " Value : " + entry.getValue());
}
}
}
输出量
Unsort Map......
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : Y Value : y
Key : Z Value : z
Key : J Value : j
Key : M Value : m
Key : N Value : n
Sorted Map......By Key
Key : A Value : a
Key : B Value : b
Key : C Value : c
Key : D Value : d
Key : E Value : e
Key : F Value : f
Key : J Value : j
Key : M Value : m
Key : N Value : n
Key : Y Value : y
Key : Z Value : z
1.2另一个java.util.TreeMap示例提供了一个自定义的Comparator来对键进行降序排序。
SortByKeyExample2.java
package com.mkyong.test;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class SortByKeyExample2 {
public static void main(String[] args) {
Map unsortMap = new HashMap();
unsortMap.put(10, "z");
unsortMap.put(5, "b");
unsortMap.put(6, "a");
unsortMap.put(20, "c");
unsortMap.put(1, "d");
unsortMap.put(7, "e");
unsortMap.put(8, "y");
unsortMap.put(99, "n");
unsortMap.put(50, "j");
unsortMap.put(2, "m");
unsortMap.put(9, "f");
System.out.println("Unsort Map......");
printMap(unsortMap);
System.out.println("\nSorted Map......By Key");
Map treeMap = new TreeMap(
new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
/* For Java 8, try this lambda
Map treeMap = new TreeMap<>(
(Comparator) (o1, o2) -> o2.compareTo(o1)
);
*/
treeMap.putAll(unsortMap);
printMap(treeMap);
}
public static void printMap(Map map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey()
+ " Value : " + entry.getValue());
}
}
}
输出量
Unsort Map......
Key : 1 Value : d
Key : 50 Value : j
Key : 2 Value : m
Key : 99 Value : n
Key : 20 Value : c
Key : 5 Value : b
Key : 6 Value : a
Key : 7 Value : e
Key : 8 Value : y
Key : 9 Value : f
Key : 10 Value : z
Sorted Map......By Key
Key : 99 Value : n
Key : 50 Value : j
Key : 20 Value : c
Key : 10 Value : z
Key : 9 Value : f
Key : 8 Value : y
Key : 7 Value : e
Key : 6 Value : a
Key : 5 Value : b
Key : 2 Value : m
Key : 1 Value : d
2.按值排序
将Map转换为List ,使用自定义Comparator对List进行排序,然后将其放入新的插入顺序地图中– LinkedHashMap
Map ---> List ---> Collections.sort() --> List (Sorted) ---> LinkedHashMap
SortByValueExample1.java
package com.mkyong.test;
import java.util.*;
public class SortByValueExample1 {
public static void main(String[] args) {
Map unsortMap = new HashMap();
unsortMap.put("z", 10);
unsortMap.put("b", 5);
unsortMap.put("a", 6);
unsortMap.put("c", 20);
unsortMap.put("d", 1);
unsortMap.put("e", 7);
unsortMap.put("y", 8);
unsortMap.put("n", 99);
unsortMap.put("j", 50);
unsortMap.put("m", 2);
unsortMap.put("f", 9);
System.out.println("Unsort Map......");
printMap(unsortMap);
System.out.println("\nSorted Map......By Value");
Map sortedMap = sortByValue(unsortMap);
printMap(sortedMap);
}
private static Map sortByValue(Map unsortMap) {
// 1. Convert Map to List of Map
List> list =
new LinkedList>(unsortMap.entrySet());
// 2. Sort list with Collections.sort(), provide a custom Comparator
// Try switch the o1 o2 position for a different order
Collections.sort(list, new Comparator>() {
public int compare(Map.Entry o1,
Map.Entry o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
// 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap
Map sortedMap = new LinkedHashMap();
for (Map.Entry entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
/*
//classic iterator example
for (Iterator> it = list.iterator(); it.hasNext(); ) {
Map.Entry entry = it.next();
sortedMap.put(entry.getKey(), entry.getValue());
}*/
return sortedMap;
}
public static void printMap(Map map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey()
+ " Value : " + entry.getValue());
}
}
}
输出量
Unsort Map......
Key : a Value : 6
Key : b Value : 5
Key : c Value : 20
Key : d Value : 1
Key : e Value : 7
Key : f Value : 9
Key : y Value : 8
Key : z Value : 10
Key : j Value : 50
Key : m Value : 2
Key : n Value : 99
Sorted Map......By Value
Key : d Value : 1
Key : m Value : 2
Key : b Value : 5
Key : a Value : 6
Key : e Value : 7
Key : y Value : 8
Key : f Value : 9
Key : z Value : 10
Key : c Value : 20
Key : j Value : 50
Key : n Value : 99
2.2升级上述sortByValue()方法以支持泛型。
public static > Map sortByValue(Map unsortMap) {
List> list =
new LinkedList>(unsortMap.entrySet());
Collections.sort(list, new Comparator>() {
public int compare(Map.Entry o1, Map.Entry o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
Map result = new LinkedHashMap();
for (Map.Entry entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
更新记录
2010年7月7日–初稿。 2014年7月8日–添加更多示例并修正错别字。 2016年8月12日–添加通用方法,重新设置代码格式,修正拼写错误并重写一些内容。
参考文献
TreeMap JavaDoc LinkedHashMap JavaDoc 比较器JavaDoc Java 8 –如何对地图排序 通配符带来更多乐趣 Collections.sort()签名 Java中超级T>和扩展T>之间的区别
标记: 通用 Java 映射 排序 树 映射
翻译自: https://mkyong.com/java/how-to-sort-a-map-in-java/