java按值对hashmap排序,并将其添加到新的map对象中

egdjgwm8  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(433)

这个问题在这里已经有答案了

按值对Map排序(58个答案)
java 8 collectors.tomap sortedmap(5个答案)
上个月关门了。
我有一个hashmap,我尝试按它的值(从大到小)排序。我想要一个新的map对象,它是新排序的hashmap的克隆(或者直接排序hashmap本身的方法)。以下是我的代码:

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
    }
}

问题是输出是原始hashmap的输出,而不是排序的hashmap。如果有人能帮助我,我将不胜感激!
编辑:我通过使用linkedhashmap修改了当前代码。

wgmfuz8q

wgmfuz8q1#

你想用 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
}

打印出这样的返回Map会导致: {cow=3, cat=2, dog=1}

相关问题