如何在Java流中按值对LinkedHashMap进行降序排序?
2022-09-03 03:33:52
要按升序排序,我可以使用:
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
我怎样才能按降序进行?
要按升序排序,我可以使用:
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
我怎样才能按降序进行?
要按相反的顺序排序,请将参数作为参数传递给 。Comparator.reverseOrder()
comparingByValue
要获得 一个,您必须专门请求一个带有 4 参数的 。如果未指定所需的地图类型,则将获得默认值,当前恰好是 .由于不保留元素的顺序,因此它绝对不会为您服务。LinkedHashMap
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
));
您可以通过任何您想要的比较器。comparingByValue
例如(我希望我的语法正确,因为我无法测试它):
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
通过以相反的顺序比较两个条目的值,使用自然排序('s),你会得到一个相反的顺序,与(相当于)将给你的。Comparable
compareTo
comparingByValue()
comparingByValue((v1,v2)->v1.compareTo(v2))
顺便说一句,我不确定返回一个实例,即使它现在返回,将来也会改变,因为Javadoc没有提到它,所以你不能依赖它。Collectors.toMap
LinkedHashMap
要确保生成的 Map 将是 LinkedHashMap,您应该使用 toMap 的不同变体:
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (v1,v2)->v1, LinkedHashMap::new));