Oxy*_*ron 15 java sorting linkedhashmap java-8 java-stream
要按升序对其进行排序,我可以使用:
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)
我怎么能按降序排列呢?
Mis*_*sha 38
要按相反顺序排序,请将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
));
Run Code Online (Sandbox Code Playgroud)
使用静态导入,它变得更加愉快:
myMap.entrySet().stream()
.sorted(comparingByValue(reverseOrder()))
.collect(toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(x,y)-> {throw new AssertionError();},
LinkedHashMap::new
));
Run Code Online (Sandbox Code Playgroud)
你可以传递你想要的任何比较器comparingByValue.
例如(我希望我的语法正确,因为我无法测试它):
myMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue((v1,v2)->v2.compareTo(v1)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)
通过比较两个条目的相反顺序的值,使用自然排序(Comparable's compareTo),你得到一个相反的顺序comparingByValue()(相当于comparingByValue((v1,v2)->v1.compareTo(v2)))将给你.
顺便说一句,我不确定它是否会Collectors.toMap返回一个LinkedHashMap实例,即使它现在也是如此,它可以在将来发生变化,因为Javadoc没有提及它,所以你不能依赖它.
要确保生成的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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15127 次 |
| 最近记录: |