我想使用Java 8流对地图进行排序并返回其键列表。
地图签名是:
Map<Integer,Integer> ranks= new HashMap<Integer, Integer>();
数据将类似于[1 = 6,5 = 13,2 = 11]
有两个条件,我必须对这些条件进行排序并返回键列表
1-如果键的所有值均不同,则按降序返回基于列表的值例如输入[1 = 6,5 = 13,2 = 11,4 = 14]结果[4,5,2,1]
2-如果键的两个或多个值具有相同的等级,则按升序返回这些相似的值,并且项的其余部分相对于其值按降序排列。例如,输入[2 = 6,5 = 13,1 = 11,3 = 13,9 = 22]结果[9,3,5,1,2]
下面是代码片段,它对于条件1正常工作,但对于条件2无效。
List<Integer> ranksList= ranks.entrySet().stream()
.sorted(Map.Entry.comparingByValue(java.util.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())
]。