You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中按频率再按数值升序排序列表(HashMap实现)报错求助

问题解决思路与修正代码

核心错误原因

你编写的Comparator泛型是Map.Entry<Integer, Integer>,但要排序的List元素类型是Integer,两者类型不匹配,导致Collections.sort方法无法找到合适的重载版本。另外原代码的频率排序是升序(低频在前),不符合预期的高频优先,需要调整排序方向。

修正后的完整代码

import java.util.*;

public class SortByFrequency {
    public static void sortByFreq(List<Integer> items) {
        // 统计元素出现频率
        Map<Integer, Integer> counter = new HashMap<>();
        for (Integer num : items) {
            counter.put(num, counter.getOrDefault(num, 0) + 1);
        }

        // 编写针对Integer类型的Comparator
        Comparator<Integer> comp = new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                int freqCompare = counter.get(b).compareTo(counter.get(a));
                // 频率相同则按数值升序排列
                if (freqCompare == 0) {
                    return a.compareTo(b);
                }
                return freqCompare;
            }
        };

        Collections.sort(items, comp);
    }

    public static void main(String[] args) {
        List<Integer> items = new ArrayList<>(Arrays.asList(42, 5, 17, 42, 42, 17, 5, 42));
        sortByFreq(items);
        System.out.println(items); // 输出:[42, 42, 42, 42, 5, 5, 17, 17]
    }
}

关键改动说明

  1. 修正Comparator类型:将Comparator<Map.Entry<Integer, Integer>>改为Comparator<Integer>,确保和待排序的List<Integer>元素类型匹配。
  2. 调整频率排序方向:用counter.get(b).compareTo(counter.get(a))实现频率降序(高频元素排在前面),原代码的升序逻辑不符合预期结果。
  3. 简化频率统计:用getOrDefault替代原有的containsKey判断,代码更简洁(也可以保留你原来的写法,效果一致)。
  4. 保留同频升序逻辑:当两个元素频率相同时,通过a.compareTo(b)按数值从小到大排列,符合需求。

Java 8+ 简化写法(可选)

如果使用Java 8及以上版本,可以用Lambda表达式进一步简化Comparator:

Collections.sort(items, (a, b) -> {
    int freqCompare = counter.get(b).compareTo(counter.get(a));
    return freqCompare != 0 ? freqCompare : a.compareTo(b);
});

内容的提问来源于stack exchange,提问作者ty matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:25:34