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] } }
关键改动说明
- 修正Comparator类型:将
Comparator<Map.Entry<Integer, Integer>>改为Comparator<Integer>,确保和待排序的List<Integer>元素类型匹配。 - 调整频率排序方向:用
counter.get(b).compareTo(counter.get(a))实现频率降序(高频元素排在前面),原代码的升序逻辑不符合预期结果。 - 简化频率统计:用
getOrDefault替代原有的containsKey判断,代码更简洁(也可以保留你原来的写法,效果一致)。 - 保留同频升序逻辑:当两个元素频率相同时,通过
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
相关产品推荐
相关产品推荐

