<Integer,Integer>在Map.Entry中的重要性是什么。<Integer,Integer> comparingByValue()

时间:2019-09-26 09:28:16

标签: java sorting generics hashmap comparator

我正在尝试按元素的频率对其进行排序

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Solution {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int itr = Integer.parseInt(br.readLine());
        for (int i = 0; i < itr; i++) {
            int n = Integer.parseInt(br.readLine());

            String[] val = br.readLine().split(" ");
            Map<Integer, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                Integer temp = Integer.parseInt(val[j]);
                map.putIfAbsent(temp, 0);
                map.put(temp, map.get(temp) + 1);
            }

在这里,我根据频率对地图进行排序,并将其存储为linkedHashMap。

            Map<Integer, Integer> sortedMap = map.entrySet().stream()
                    .sorted(
                            (Map.Entry.<Integer, Integer>comparingByValue())
                            .thenComparing(Map.Entry.comparingByKey()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                            (e1, e2) -> e1, LinkedHashMap::new));

            for(Map.Entry entries : sortedMap.entrySet()){
                System.out.println(entries.getKey() + " " + entries.getValue());
            }
        }
    }


}

以下引发编译器错误。

            Map<Integer, Integer> sortedMap = map.entrySet().stream()
                    .sorted(
                            (Map.Entry.comparingByValue())
                            .thenComparing(Map.Entry.comparingByKey()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                            (e1, e2) -> e1, LinkedHashMap::new));

样本输入 1个 6 4 -2 10 12 -8 4

样本输出0

-8 -2 10 12 4 4

1 个答案:

答案 0 :(得分:0)

public static <K, V extends Comparable<? super V>>
    Comparator<Map.Entry<K, V>> comparingByValue()

是静态方法,当在一个通用上下文中使用时,它需要K, V才能正确设置/纠正/调整通用上下文。否则,假设KObject,而VComparable,这不是Stream<Map.Entry<Integer, Integer>>#sorted所期望的。请注意,流是从<Map.Entry<Integer, Integer>>获得map.entrySet()的,其中map<Integer, Integer>参数化或结果sortedMap的类型为{{1 }}。

Map<Integer, Integer>提供了很好解决它的必要提示。

Map.Entry.<Integer, Integer>comparingByValue()本身是很模糊的东西。

Map.Entry.comparingByValue()

为它提供通用上下文会变得更加有意义。

Comparator<Map.Entry<Object, Comparable<Comparable<?>>>> 
     comparator = comparingByValue();

在您的情况下,这很重要,因为Comparator<Map.Entry<Integer, Integer>> comparator = comparingByValue(); 将启动链,并且以下实例方法(例如Map.Entry.comparingByValue())将基于先前方法的通用参数来解析其自己的通用参数(此处为thenComparing