关于Map的排序,首先我们先了解一下 TreeMap
TreeMap :
1.基于红黑树实现的排序Map
2.实现了SortedMap接口,默认根据Map的key升序排序
3.key不能为空
4.线程不安全
- 根据Map的key进行排序,我们可以使用TreeMap
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("a", 2);
treeMap.put("c", 1);
treeMap.put("b", 3);
treeMap.put("e", 5);
treeMap.put("d", 6);
treeMap.put("f", 4);
Set<Map.Entry<String, Integer>> entries = treeMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
}
我们可以得到如下结果:
key=a,value=2
key=b,value=3
key=c,value=1
key=d,value=6
key=e,value=5
key=f,value=4
不难发现,key已经自动根据a-z的顺序进行了排序;
当然,如果我们将key置为数字,依然会按照从小到大的顺序进行排序;
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(2, "aa");
treeMap.put(1, "ab");
treeMap.put(3, "ad");
treeMap.put(5, "ae");
treeMap.put(6, "ac");
treeMap.put(4, "af");
Set<Map.Entry<Integer, String>> entries = treeMap.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
}
我们可以得到如下结果:
key=1,value=ab
key=2,value=aa
key=3,value=ad
key=4,value=af
key=5,value=ae
key=6,value=ac
- 当我们想要根据Map的value进行排序呢?
我们可以使用SortedMap,结合Comparator比较器,再使用Lambda表达式轻松实现根据value的排序
SortedMap<String, Integer> sortedMap = new TreeMap<>();
sortedMap.put("a", 2);
sortedMap.put("c", 1);
sortedMap.put("b", 3);
sortedMap.put("e", 5);
sortedMap.put("d", 6);
sortedMap.put("f", 4);
Set<Map.Entry<String, Integer>> entrySet = sortedMap.entrySet();
List<Map.Entry<String, Integer>> list = new ArrayList<>();
list.addAll(entrySet);
Collections.sort(list, Comparator.comparing(o -> o.getValue().toString()));
for (Map.Entry<String, Integer> entry : list) {
System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
}
我们可以得到如下结果:
key=c,value=1
key=a,value=2
key=b,value=3
key=f,value=4
key=e,value=5
key=d,value=6
亦可如下编写代码:
SortedMap<String, Integer> sortedMap = new TreeMap<>();
sortedMap.put("a", 2);
sortedMap.put("c", 1);
sortedMap.put("b", 3);
sortedMap.put("e", 5);
sortedMap.put("d", 6);
sortedMap.put("f", 4);
Set<Map.Entry<String, Integer>> entrySet = sortedMap.entrySet();
List<Map.Entry<String, Integer>> list = new ArrayList<>();
list.addAll(entrySet);
List<Map.Entry<String, Integer>> collect = list.stream().sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)).collect(Collectors.toList());
for (Map.Entry<String, Integer> entry : collect) {
System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
}
得到结果如下:
key=c,value=1
key=a,value=2
key=b,value=3
key=f,value=4
key=e,value=5
key=d,value=6
在JDK 1.8中新增了函数式编程,对上述代码的解释为:
1.先将list集合转换为流,即:list.stream(),值得注意的是:在stream()中所做的任何操作都不会影响到原集合;
2.sorted() 方法:对list集合进行排序;
3.Comparator.comparing(Map.Entry<String, Integer>::getValue):顾名思义,就是此处的比较规则,Map.Entry中有getKey(),getValue()等方法,通过改变取值,就可以改变排序对象,而默认排序为自然排序,reversed():该方法将其改变为倒序;
4.map(Map.Entry<String, Integer>::getKey):此处将Entry<String, Integer>中的key单独抽离出来;
5.collect(Collectors.toList()):告诉程序返回的是一个List集合;
网友评论