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
TA贡献2039条经验 获得超7个赞
有时我回答了如何在 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
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
添加回答
举报