我想使用Java 8流排序的映射,并返回其键的列表。
地图的签名是:
Map<Integer, Integer> ranks = new HashMap<Integer, Integer>();
并且数据将是如[1 = 6,5 = 13,2 = 11]
有关于这一点我有排序和返回键列表两个条件。
如果键的所有值是不同的,那么排序和按降序排列返回基于列表值,例如
input [1=6 , 5=13 , 2= 11 , 4 = 14 ]
result [4,5,2,1]
如果关键的两个或多个值都具有相同的等级,然后返回这些类似按升序,而该项目的其余部分是按降序相对于它们的值,如
input [2=6 , 5=13 , 1= 11 , 3=13 ,9 = 22 ] result [9,3,5,1,2]
下面是工作正常为条件1的代码片段,但不为条件2。
List<Integer> ranksList = ranks.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.map(Map.Entry::getKey)
.limit(k)
.collect(Collectors.toList());
您正在寻找一个自定义Comparator
像这样:
.sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()) == 0 ?
o1.getKey().compareTo(o2.getKey()) : o2.getValue().compareTo(o1.getValue()))
从理论上讲,
按降序排列第一比较值o2.getValue().compareTo(o1.getValue())
和
如果它们相等比较升序排列的按键o1.getKey().compareTo(o2.getKey())
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句