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

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

首先按值對地圖進行排序,然后按鍵

首先按值對地圖進行排序,然后按鍵

紅顏莎娜 2022-06-04 09:11:23
我實際上能夠僅Map根據Key和value對它們進行排序,我什至嘗試對它們進行如下排序:我根據國家對學生進行排序,如果兩個學生碰巧相同states,則StudentID僅在匹配的國家中排序。到目前為止我已經嘗試過:final Map<Integer, String> studentMaster = new HashMap<>() {{        put(146, "Sweden");        put(148, "Sweden");        put(110, "Orebro");        put(6, "Malmo");        put(14, "Orebro");        put(26, "Malmo");    }       };    studentMaster.entrySet().stream()    .sorted((i1,i2)->i1.getValue().compareTo(i2.getValue()))    .sorted((j1,j2)->j1.getKey().compareTo(j2.getKey()))    .forEach(System.out::println);我得到的結果**(實際輸出)**14=Orebro26=Malmo110=Orebro146=Sweden148=Sweden預期輸出:  26=Malmo  14=Orebro  110=Orebro  146=Sweden  148=Sweden
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

注意:您的預期和實際輸出與您添加到Map.


您的代碼不起作用的原因是因為您Stream#sorted使用兩個單獨的 s 調用了兩次Comparator,所以在您的情況下,第一次調用Stream#sorted是無用的(因為它被第二次調用覆蓋了)。


Comparator通過將自定義傳遞給以下內容,我能夠實現您的預期輸出Stream#sorted:


Map.Entry.<Integer, String>comparingByValue()

    .thenComparing(Map.Entry.comparingByKey())

輸出:


6=Malmo

26=Malmo

14=Orebro

110=Orebro

146=Sweden

148=Sweden


查看完整回答
反對 回復 2022-06-04
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

有時我回答了如何在 java 中對名稱和年齡進行排序,除了用于存儲的數據結構之外,與您的問題有許多相似之處。遍歷每個鍵并對其進行排序,然后再次按值進行排序,然后再排序是非常乏味的,并且會讓您感到非常困惑。只記得你以前不使用Stream時在 Map 中的遍歷方式:


for (Map.Entry<String,String> entry : somemap.entrySet()){..Some Statements..};

studentMaster.entrySet().stream()

    .sorted(Comparator.comparing((Map.Entry<Integer, String> m) -> m.getValue())

              .thenComparing(Map.Entry::getKey)).forEach(System.out::println);

輸出


6=Malmo

26=Malmo

14=Orebro

110=Orebro

146=Sweden

148=Sweden


查看完整回答
反對 回復 2022-06-04
?
MMTTMM

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

Comparator應該是這樣的:


Comparator<Entry<Integer, String>> comparator = (o1, o2) -> {

    int i = o1.getValue().compareTo(o2.getValue());

    if (i == 0) {

        return o1.getKey().compareTo(o2.getKey());

    } else {

        return i;

    }

};

然后將其傳遞給Stream#sorted方法: studentMaster.entrySet().stream().sorted(comparator).forEach(System.out::println);


輸出:


6=Malmo

26=Malmo

14=Orebro

110=Orebro

146=Sweden

148=Sweden


查看完整回答
反對 回復 2022-06-04
  • 3 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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