为了账号安全,请及时绑定邮箱和手机立即绑定

首先按值对地图进行排序,然后按键

首先按值对地图进行排序,然后按键

红颜莎娜 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条经验 获得超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


查看完整回答
反对 回复 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 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信