基于HashMap实现Java数组元素频次统计的for循环优化咨询
问题根因
你写的第一轮遍历数组的for循环,其实已经完成了数组元素频次的核心统计逻辑:遍历过程中把每个元素作为HashMap的键,把对应出现次数作为值完成了累计计算。
现在代码无法输出出现次数,问题全部出在最后一轮遍历Map的环节:
- 循环仅遍历了Map的
keySet(),只拿到了数组元素本身,完全没有读取对应的次数值 - 输出逻辑固定硬编码了重复元素的提示文案,没有结合实际统计的次数做判断和展示
调整方法
- 把原本仅遍历键的循环,改成遍历Map的键值对集合(
entrySet()),循环过程中可以同时获取到「数组元素值」和「对应的累计出现次数」两个信息 - 可根据实际需要加分支判断:比如出现次数≥2的元素标记为重复项,同时打印实际次数;仅出现1次的元素也同步打印频次,实现全量统计
- 可选简化:把原本手写的「键不存在则置1、存在则值+1」的判断逻辑,换成Map自带的
merge方法,去掉冗余的判空代码
如果你希望最小改动原有代码,完全保留第一个循环的手写统计逻辑,不需要替换为
merge方法,仅修改最后一轮遍历Map的循环即可实现频次输出:只要把原本遍历keySet()的逻辑替换为遍历entrySet(),就能同时拿到元素和对应的累计次数,不需要改动前面的统计逻辑。
调整后可直接运行的代码
import java.util.HashMap; import java.util.Map; public class findDuplicates { public static void main(String[] args) { int[] input = { 2, 3, 6, 5, 5, 6, 9, 8, 7, 7, 7, 4, 1, 2, 5, 5, 2 }; dulicates(input); } public static void dulicates(int[] MyArray) { // 原变量名HashMap与类名重名,调整为更具语义的freqMap Map<Integer, Integer> freqMap = new HashMap<>(); for (int num : MyArray) { /* 原手写统计逻辑(替换上述merge行即可完全保留原有逻辑): if (!freqMap.containsKey(num)) { freqMap.put(num, 1); } else { freqMap.put(num, freqMap.get(num) + 1); } */ // 用merge简化等价实现,效果和手写逻辑完全一致 freqMap.merge(num, 1, Integer::sum); } // 遍历键值对,同时获取元素和对应次数 for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) { int num = entry.getKey(); int count = entry.getValue(); if (count >= 2) { System.out.println("重复元素:" + num + ",累计出现次数:" + count); } else { System.out.println("非重复元素:" + num + ",累计出现次数:" + count); } } } }
运行效果
上述代码运行后,会对输入数组的所有元素完成全量频次统计,既会标注出存在重复的元素,也会同步输出每个数值的实际出现次数,比如输入中的2共出现3次、5共出现4次,都会被准确统计并打印。
内容的提问来源于stack exchange,提问作者sinco demayo
相关产品推荐
相关产品推荐

