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

我实际上能够仅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=Orebro

26=Malmo

110=Orebro

146=Sweden

148=Sweden

预期输出:


  26=Malmo

  14=Orebro

  110=Orebro

  146=Sweden

  148=Sweden


红颜莎娜
浏览 114回答 3
3回答

米脂

注意:您的预期和实际输出与您添加到Map.您的代码不起作用的原因是因为您Stream#sorted使用两个单独的 s 调用了两次Comparator,所以在您的情况下,第一次调用Stream#sorted是无用的(因为它被第二次调用覆盖了)。Comparator通过将自定义传递给以下内容,我能够实现您的预期输出Stream#sorted:Map.Entry.<Integer, String>comparingByValue()&nbsp; &nbsp; .thenComparing(Map.Entry.comparingByKey())输出:6=Malmo26=Malmo14=Orebro110=Orebro146=Sweden148=Sweden

largeQ

有时我回答了如何在 java 中对名称和年龄进行排序,除了用于存储的数据结构之外,与您的问题有许多相似之处。遍历每个键并对其进行排序,然后再次按值进行排序,然后再排序是非常乏味的,并且会让您感到非常困惑。只记得你以前不使用Stream时在 Map 中的遍历方式:for (Map.Entry<String,String> entry : somemap.entrySet()){..Some Statements..};studentMaster.entrySet().stream()&nbsp; &nbsp; .sorted(Comparator.comparing((Map.Entry<Integer, String> m) -> m.getValue())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .thenComparing(Map.Entry::getKey)).forEach(System.out::println);输出6=Malmo26=Malmo14=Orebro110=Orebro146=Sweden148=Sweden

MMTTMM

Comparator应该是这样的:Comparator<Entry<Integer, String>> comparator = (o1, o2) -> {&nbsp; &nbsp; int i = o1.getValue().compareTo(o2.getValue());&nbsp; &nbsp; if (i == 0) {&nbsp; &nbsp; &nbsp; &nbsp; return o1.getKey().compareTo(o2.getKey());&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; return i;&nbsp; &nbsp; }};然后将其传递给Stream#sorted方法: studentMaster.entrySet().stream().sorted(comparator).forEach(System.out::println);输出:6=Malmo26=Malmo14=Orebro110=Orebro146=Sweden148=Sweden
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java