如何修改Java代码实现数组重复元素的单次统计输出?
解决数组元素重复次数统计重复输出的问题
我来帮你搞定这个问题!你遇到的核心问题是原代码会对每个重复元素都执行一次统计打印,所以同一个数字的结果会重复出现多次。咱们来一步步优化代码,实现每个数字只输出一次统计结果的需求。
先分析原代码的问题
原代码的问题出在这两点:
- 外层循环遍历数组的每一个元素,当遇到重复元素时,会再次触发统计逻辑
- 内部循环每次找到匹配项就立刻打印,而不是等统计完当前数字的所有重复项后再一次性输出
解决方案1:基于排序数组优化(利用你已有的排序逻辑)
既然你已经用了Arrays.sort()把数组排序,相同元素会相邻排列,那我们可以利用这个特性,统计完当前数字的总次数后,直接跳过所有重复元素,只打印一次结果:
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7}; Arrays.sort(array); int i = 0; while (i < array.length) { int currentNum = array[i]; int count = 1; // 数字本身至少出现1次 // 统计后续所有相同的元素 while (i + count < array.length && array[i + count] == currentNum) { count++; } // 只打印一次当前数字的统计结果 System.out.println(currentNum + " repeats " + count + " times"); // 直接跳到下一个不同的元素,避免重复处理 i += count; } } }
如果想要像你说的那样,把所有结果用分号分隔在一行输出,可以稍微修改成这样:
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7}; Arrays.sort(array); StringBuilder resultBuilder = new StringBuilder(); int i = 0; while (i < array.length) { int currentNum = array[i]; int count = 1; while (i + count < array.length && array[i + count] == currentNum) { count++; } // 拼接结果,非第一个元素前加分号 if (resultBuilder.length() > 0) { resultBuilder.append("; "); } resultBuilder.append(currentNum + " repeats " + count + " times"); i += count; } // 一次性输出所有结果 System.out.println(resultBuilder.toString()); } }
解决方案2:使用HashMap统计(无需排序,更灵活)
如果不想依赖排序,可以用HashMap来存储每个数字的出现次数,遍历完数组后再统一输出,这种方法逻辑更直观:
import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7}; Map<Integer, Integer> numCountMap = new HashMap<>(); // 遍历数组,统计每个数字的出现次数 for (int num : array) { // 用getOrDefault简化:如果数字不存在,默认次数为0,加1后存入 numCountMap.put(num, numCountMap.getOrDefault(num, 0) + 1); } // 遍历Map,每个数字只输出一次结果 StringBuilder resultBuilder = new StringBuilder(); for (Map.Entry<Integer, Integer> entry : numCountMap.entrySet()) { if (resultBuilder.length() > 0) { resultBuilder.append("; "); } resultBuilder.append(entry.getKey() + " repeats " + entry.getValue() + " times"); } System.out.println(resultBuilder.toString()); } }
这两种方法都能解决你的问题,选哪种取决于你的需求:如果需要保持排序后的顺序,选第一种;如果不需要排序,第二种更高效。
内容的提问来源于stack exchange,提问作者alender
相关产品推荐
相关产品推荐

