首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 ><Integer,Integer> in Map.Entry.<Integer,Integer>comparingByValue()的重要性是什么?

<Integer,Integer> in Map.Entry.<Integer,Integer>comparingByValue()的重要性是什么?
EN

Stack Overflow用户
提问于 2019-09-26 17:28:17
回答 1查看 315关注 0票数 1

我正在尝试根据元素的频率对元素进行排序

代码语言:javascript
运行
复制
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);
            }

在这里,我根据freq对映射进行排序,并将其存储为linkedHashMap。

代码语言:javascript
运行
复制
            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());
            }
        }
    }


}

下面是抛出编译器错误。

代码语言:javascript
运行
复制
            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

EN

回答 1

Stack Overflow用户

发布于 2019-09-26 17:41:33

代码语言:javascript
运行
复制
public static <K, V extends Comparable<? super V>>
    Comparator<Map.Entry<K, V>> comparingByValue()

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

Map.Entry.<Integer, Integer>comparingByValue()给出了很好地解决这个问题所需的提示。

就目前而言,Map.Entry.comparingByValue()是一个非常模糊的东西。

代码语言:javascript
运行
复制
Comparator<Map.Entry<Object, Comparable<Comparable<?>>>> 
     comparator = comparingByValue();

当你给它一个通用的上下文时,它会变得更有意义。

代码语言:javascript
运行
复制
Comparator<Map.Entry<Integer, Integer>>
    comparator = comparingByValue();

在您的例子中,这一点很重要,因为Map.Entry.comparingByValue()启动了链,下面的实例方法(例如thenComparing)将根据前面方法(这里是comparingByValue)的泛型参数来解析它们自己的泛型参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58113660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档