为什么我的地图没有正确排序?

时间:2019-05-13 20:52:25

标签: java hashmap java-stream

我有这个HashMap,

private static Map<String, Integer> messageCount = new HashMap<>();

我试图按值排序。 我找到了以下代码:

Map<String, Integer> sorted = Server.getMessageCount().entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                                (e1, e2) -> e1, HashMap::new));

理论上应该按Integer值对它进行排序,但是Map仍按字母顺序(按键)进行排序。

(我用它来输出我的地图,但是我很确定这不是问题所在(或者是吗?)

System.out.println(Arrays.toString(sorted.entrySet().toArray()));

1 个答案:

答案 0 :(得分:3)

正如docs所说的,HashMap不会保留物品的奇数。

  

...此类不保证地图的顺序;特别是,它不能保证顺序会随着时间的推移保持恒定。

您应该改用LinkedHashMap。这样可以保留插入顺序(docs):

  

...此链接列表定义了迭代顺序,通常是将键插入映射的顺序(插入顺序)。

Map<String, Integer> sorted = Server.getMessageCount()
         .entrySet().stream()
         .sorted(Map.Entry.comparingByValue())
         .collect(Collectors.toMap(
                 Map.Entry::getKey, Map.Entry::getValue,
                 (e1, e2) -> e1, LinkedHashMap::new
          ));