要按升序对其进行排序,我可以使用:
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
我该如何按降序排列?
答案 0 :(得分:34)
要按相反顺序排序,请将Comparator.reverseOrder()
作为参数传递给comparingByValue
。
要获得LinkedHashMap
,您必须明确要求使用4个参数toMap()
。如果您没有指定所需的地图类型,您将获得默认的任何内容,当前恰好是HashMap
。由于HashMap
不保留元素的顺序,因此绝对不适合你。
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(x,y)-> {throw new AssertionError();},
LinkedHashMap::new
));
使用静态导入,它会变得更加愉快:
myMap.entrySet().stream()
.sorted(comparingByValue(reverseOrder()))
.collect(toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(x,y)-> {throw new AssertionError();},
LinkedHashMap::new
));
答案 1 :(得分:5)
你可以传递你想要的任何比较者comparingByValue
。
例如(我希望我的语法正确,因为我无法测试它):
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
通过比较相反顺序的两个条目的值,使用自然排序(Comparable
的{{1}}),与compareTo
相比得到一个相反的顺序(相当于comparingByValue()
)会给你。
comparingByValue((v1,v2)->v1.compareTo(v2))
是否会返回Collectors.toMap
个实例,即使它当前有,也会在将来发生变化,因为Javadoc没有提及它,所以你不能依赖它。
要确保生成的Map是LinkedHashMap,您应该使用toMap的其他变体:
LinkedHashMap
答案 2 :(得分:3)
Stream有interface
方法接受比较器,因此您可以直接使用比较器sorted
进行降序排序。
要按升序对地图进行排序,我们可以将排序反转为(x,y)->y.getKey().compareTo(x.getKey())
为了将结果合并回LinkedHashMap,我们可以使用收集器(x,y)->x.getKey().compareTo(y.getKey())
返回一个收集器,它将元素累积到一个Map中,其键和值是将提供的映射函数应用于输入元素的结果。
工作代码
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
答案 3 :(得分:2)
自Java 1.8以来 java.util.Comparator.reversed()
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue().reversed())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));