如何在Java 8 Stream中定义自定义排序比较器,以便在键和值上进行比较

问题描述 投票:0回答:1

我想使用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());
java lambda java-8 stream java-stream
1个回答
0
投票

您正在寻找这样的自定义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())]。

© www.soinside.com 2019 - 2024. All rights reserved.