Java实现:查找ArrayList中频率最高且值最大的元素
解决Java ArrayList中频率最高且值最大元素的问题
需求:现有Java ArrayList,元素为
4、4、3、3、5、6,需实现方法找出其中出现频率最高的值;若多个元素出现次数相同,则返回值最大的元素(如示例应返回4)。
我来帮你完善这个需求的实现,这里提供两种方案:一种是基于你现有嵌套循环思路的修正版,另一种是更高效的HashMap实现,都能满足你的要求。
方法一:嵌套循环实现(直观易理解)
你的初始代码思路是对的,但存在内层循环起始索引错误的问题,我帮你修正并完善:
private int getFrequentNumber(ArrayList<Integer> arr) { // 先处理空列表的情况,避免空指针异常 if (arr == null || arr.isEmpty()) { throw new IllegalArgumentException("传入的列表不能为空"); } int popular = arr.get(0); int maxCount = 1; for (int i = 0; i < arr.size(); i++) { int current = arr.get(i); int tempCount = 0; // 统计当前元素在列表中的总出现次数 for (int j = 0; j < arr.size(); j++) { if (current == arr.get(j)) { tempCount++; } } // 核心判断:要么次数更多,要么次数相同但当前元素值更大 if (tempCount > maxCount || (tempCount == maxCount && current > popular)) { maxCount = tempCount; popular = current; } } return popular; }
思路说明:
- 先做参数校验,避免空列表导致的运行时错误
- 初始化结果为列表第一个元素,最大出现次数为1
- 外层循环遍历每个元素,内层循环统计该元素的总出现次数
- 每次统计后和当前记录的最优结果比较:
- 如果当前元素的出现次数比
maxCount大,直接更新结果和最大次数 - 如果次数相同,但当前元素的值比
popular大,也更新结果
- 如果当前元素的出现次数比
方法二:HashMap实现(高效推荐)
嵌套循环的时间复杂度是O(n²),当列表元素较多时效率较低,推荐用HashMap统计频率,时间复杂度可降到O(n):
import java.util.HashMap; import java.util.Map; import java.util.ArrayList; private int getFrequentNumber(ArrayList<Integer> arr) { if (arr == null || arr.isEmpty()) { throw new IllegalArgumentException("传入的列表不能为空"); } // 用HashMap存储元素与对应的出现次数 Map<Integer, Integer> frequencyMap = new HashMap<>(); for (int num : arr) { // getOrDefault简化统计逻辑:元素不存在则默认次数为0,之后加1 frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1); } int popular = arr.get(0); int maxCount = 0; // 遍历HashMap筛选符合条件的元素 for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) { int currentNum = entry.getKey(); int currentCount = entry.getValue(); // 同样的核心判断逻辑 if (currentCount > maxCount || (currentCount == maxCount && currentNum > popular)) { maxCount = currentCount; popular = currentNum; } } return popular; }
思路说明:
- 第一步:遍历一次列表,用HashMap记录每个元素的出现次数
- 第二步:遍历HashMap的键值对,按照规则筛选出频率最高且值最大的元素
- 同样做了参数校验,保证代码的鲁棒性
测试你的示例列表[4,4,3,3,5,6],两种方法都会返回4,完全符合需求。
内容的提问来源于stack exchange,提问作者Mitch Wolfe
相关产品推荐
相关产品推荐

