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

标签 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

最佳答案

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

是一个静态方法,它需要 K, V在其中使用时正确设置/更正/调整通用上下文。否则,它假设 KObjectVComparable这不是什么Stream<Map.Entry<Integer, Integer>>#sorted期望。请注意,流得到 <Map.Entry<Integer, Integer>>来自 map.entrySet() ,其中map参数化为 <Integer, Integer>或结果的类型 sortedMap ,即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 )将根据前面方法的泛型参数(此处为 comparingByValue )解析自己的泛型参数。

关于java - Map.Entry.<Integer, Integer>comparingByValue() 中 <Integer,Integer> 的重要性是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58113660/

相关文章:

sorting - 如何用柏树检查字母排序

Java 泛型类型绑定(bind)。为什么这不编译?

java - 如何将两个逗号分隔的值写为一个值

Java 扩展集合过滤

java - 如何使用 hibernate 在 java 中正确实现 owner-owned-owner2 关联?

java - java中有更复杂版本的冒泡排序算法吗?

generics - 如何根据其父类检查类型?

java - 获取Java中泛型接口(interface)序列化后的类型

Java:使用Prepared Statements在MySQL数据库中插入批量数据

java - Struts 2 + Spring 在 session 中放置一个托管的 spring bean