亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在java 8 Stream中定義自定義排序比較器來比較鍵和值

如何在java 8 Stream中定義自定義排序比較器來比較鍵和值

臨摹微笑 2024-01-05 16:23:58
我想使用 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());
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

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())。


查看完整回答
反對 回復 2024-01-05
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

Comparator聲明鏈接的使用thenComparing。


Comparator<Map.Entry<Integer, Integer>> entryComparator

            = Map.Entry.<Integer, Integer>comparingByValue(Comparator.reverseOrder())

                                         .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()

            .sorted(entryComparator)

            .map(Map.Entry::getKey).limit(47)

            .collect(Collectors.toList());


System.out.println(ranksList);

輸出是所需的:


[9, 3, 5, 1, 2]


Java 需要 的類型規范<Integer, Integer>來comparingByValue推斷 的類型Map.Entry.comparingByKey()。


查看完整回答
反對 回復 2024-01-05
  • 2 回答
  • 0 關注
  • 337 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號