如何在java 8 Stream中定义自定义排序比较器来比较键和值

我想使用 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());


临摹微笑
浏览 216回答 2
2回答

潇湘沐

Comparator您正在寻找这样的定制:.sorted((o1,&nbsp;o2)&nbsp;->&nbsp;o2.getValue().compareTo(o1.getValue())&nbsp;==&nbsp;0&nbsp;? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o1.getKey().compareTo(o2.getKey())&nbsp;:&nbsp;o2.getValue().compareTo(o1.getValue()))理论上,首先按降序比较值,o2.getValue().compareTo(o1.getValue())然后如果它们相等,则按升序比较键o1.getKey().compareTo(o2.getKey())。

守着一只汪

Comparator声明链接的使用thenComparing。Comparator<Map.Entry<Integer, Integer>> entryComparator&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Map.Entry.<Integer, Integer>comparingByValue(Comparator.reverseOrder())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.thenComparing(Map.Entry.comparingByKey());Map<Integer,Integer> ranks = Map.of(2, 6, 5, 13, 1, 11, 3, 13, 9, 22);List<Integer> ranksList= ranks.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .sorted(entryComparator)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(Map.Entry::getKey).limit(47)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());System.out.println(ranksList);输出是所需的:[9, 3, 5, 1, 2]Java 需要 的类型规范<Integer, Integer>来comparingByValue推断 的类型Map.Entry.comparingByKey()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java