3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
注意:您的預(yù)期和實(shí)際輸出與您添加到Map.
您的代碼不起作用的原因是因?yàn)槟鶶tream#sorted使用兩個(gè)單獨(dú)的 s 調(diào)用了兩次Comparator,所以在您的情況下,第一次調(diào)用Stream#sorted是無用的(因?yàn)樗坏诙握{(diào)用覆蓋了)。
Comparator通過將自定義傳遞給以下內(nèi)容,我能夠?qū)崿F(xiàn)您的預(yù)期輸出Stream#sorted:
Map.Entry.<Integer, String>comparingByValue()
.thenComparing(Map.Entry.comparingByKey())
輸出:
6=Malmo
26=Malmo
14=Orebro
110=Orebro
146=Sweden
148=Sweden

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
有時(shí)我回答了如何在 java 中對名稱和年齡進(jìn)行排序,除了用于存儲的數(shù)據(jù)結(jié)構(gòu)之外,與您的問題有許多相似之處。遍歷每個(gè)鍵并對其進(jìn)行排序,然后再次按值進(jìn)行排序,然后再排序是非常乏味的,并且會讓您感到非常困惑。只記得你以前不使用Stream時(shí)在 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

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
Comparator應(yīng)該是這樣的:
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
添加回答
舉報(bào)