数组元素计数方法输出结果异常问题求助
为什么你的数组计数方法输出会丢元素?我来帮你拆解问题
首先,我一眼就看到了代码里的核心bug:你在内部循环里修改了外部循环的计数器变量i,同时外部循环本身每次结束后还会自动执行i++,这就导致i被两次递增,直接跳过了大量元素——这就是为什么很多元素的计数根本没出现在输出里!
咱们拿你的第一个例子一步步拆解,你传的数组排序后是[1,2,2,2,3,4,4,5,6,7,7,8,9]:
- 第一次外部循环
i=0,处理元素1,内部循环找到它后,你把i改成了1,然后外部循环结束时又自动给i加1,变成2——直接跳过了索引1的元素2(不过因为数组有序,索引1和2都是2,暂时没影响,但后面就出问题了)。 - 接下来
i=2处理元素2,内部循环找到三个2,你把i改成了5,外部循环结束又加1变成6——直接跳过了索引3、4的元素2、3,所以3的计数根本没被输出。 - 以此类推,
5、6、8这些元素的索引都被叠加的i++跳过了,自然不会出现在输出里。
再看第二个短数组,排序后是[2,2,4,4,5,6,7,7,9]:
i=0处理2后,内部循环把i改成2,外部循环加1变成3,跳过了索引1(但也是2,不影响计数),但接下来直接跳到索引3处理4,跳过了索引2的4(同样有序,计数没错),然后处理完4后i变成5,外部加1到6,跳过了5、6两个元素,最后处理完7后i变成8,外部加1到9,循环结束,9也没被处理。
现在说修复方案,给你两种选择:
方案一:利用有序数组的特性高效统计
既然你已经用了Arrays.sort(),那就好好利用有序数组的优势——相同元素会集中在一起,只需要一次遍历就能统计完:
private static void methodCount(int[] array) { if (array == null || array.length == 0) { return; } Arrays.sort(array); int currentNum = array[0]; int counter = 1; // 从第二个元素开始遍历 for (int i = 1; i < array.length; i++) { if (array[i] == currentNum) { counter++; } else { // 输出上一个元素的计数 System.out.println("Number " + currentNum + " is counted " + counter + " times!"); currentNum = array[i]; counter = 1; } } // 别忘了输出最后一个元素的计数 System.out.println("Number " + currentNum + " is counted " + counter + " times!"); }
方案二:不用排序,用HashMap统计(更灵活)
如果不需要排序,用HashMap来统计每个元素的出现次数是更常规的做法,时间效率也更高:
import java.util.HashMap; import java.util.Map; private static void methodCount(int[] array) { Map<Integer, Integer> countMap = new HashMap<>(); for (int num : array) { // 存在就加1,不存在就设为1 countMap.put(num, countMap.getOrDefault(num, 0) + 1); } // 遍历输出结果 for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { System.out.println("Number " + entry.getKey() + " is counted " + entry.getValue() + " times!"); } }
如果想要保持元素的原始出现顺序,可以把HashMap换成LinkedHashMap。
总结一下,你的原方法最大的问题就是修改了循环计数器的预期值,导致遍历逻辑混乱,同时时间效率极低(O(n²))。上面两种方案都能解决你的问题,选哪个看你是否需要排序后的输出顺序~
内容的提问来源于stack exchange,提问作者makaveli
相关产品推荐
相关产品推荐

