【问题标题】:Java Sort a HashMap by Values and Add it to new Map Object [duplicate]Java按值对HashMap进行排序并将其添加到新的Map对象[重复]
【发布时间】:2021-03-12 09:58:54
【问题描述】:

我有一个 HashMap,我尝试按其值(从大到小)排序。我想要一个新的 Map 对象,它是新排序哈希图的克隆(或直接对哈希图本身进行排序的方法)。这是我的以下代码:

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class Repetition {
    public static Map<Object, Integer> countRepititions(Object[] e) {
        Map<Object, Integer> occurrences = new HashMap<>();
        for (int i = 0; i < e.length; i++) {
            occurrences.putIfAbsent(e[i], 0);
            occurrences.computeIfPresent(e[i], (k, v) -> v + 1);
        }

        return occurrences.entrySet().stream()
                                     .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
                                     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, HashMap::new));
    }

    public static void main(String[] args) {
        Object[] arr = { "cat", "dog", "cat", "cow", "cow", "cow" };

        System.out.println(countRepititions(arr)); //should be cow, cat, dog
    }
}

问题是输出是原始哈希图而不是排序哈希图的输出。如果有人可以帮助我,将不胜感激!

编辑: 我设法改用 LinkedHashMap 来修改当前代码。

【问题讨论】:

标签: java dictionary hashmap java-stream


【解决方案1】:

您想使用保留顺序的LinkedHashMap(适合排序)。该解决方案需要两个流:

public static Map<Object, Long> countRepititions(Object[] e) {
  return Arrays.stream(e)
      .collect(Collectors.groupingBy(
              Function.identity(),                                   // object as key
              Collectors.counting()))                                // count is value
      .entrySet().stream()
      .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) // reversed order
      .collect(Collectors.toMap(
              Map.Entry::getKey,                                     // preserve keys
              Map.Entry::getValue,                                   // preserve values
              (l, r) -> l,                                           // merge function
              LinkedHashMap::new));                                  // LinkedHashMap
}

打印出这样的返回地图结果:

{cow=3, cat=2, dog=1}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2018-06-06
    • 2021-05-09
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多