Java程序调试:如何仅输出正确的数字出现次数统计结果?
问题解决:避免重复输出数字统计结果
问题根源
你当前的代码在排序后的数组上,外层循环会遍历每一个元素,包括重复元素。比如数字2出现两次:第一次遍历第一个2时统计出出现2次并打印;第二次遍历第二个2时,统计的是从它之后的元素里2的数量(此时为0),所以count=1,又打印一次,最终导致重复输出。
修改方案一:基于现有代码调整,跳过重复元素
数组已经排序,相同数字会连续排列,我们可以在统计完一个数字后,直接跳到下一个不同数字的位置,避免重复处理:
修改最后的循环部分:
for (i = 0; i < userNumsNoZero.length; ) { count = 1; // 统计当前数字的出现次数,数组已排序,遇到不同数字就停止 for (int j = i + 1; j < userNumsNoZero.length; j++) { if (userNumsNoZero[i] == userNumsNoZero[j]) { count++; } else { break; } } // 打印统计结果 if (count > 1) { System.out.println("The number " + userNumsNoZero[i] + " appears " + count + " times."); } else { System.out.println("The number " + userNumsNoZero[i] + " appears " + count + " time."); } // 跳到下一个不同数字的起始位置 i += count; }
关键改动:
- 外层循环不再逐次
i++,而是直接跳到当前数字最后一次出现的下一个位置(i += count) - 内层统计循环遇到不同数字就
break,利用排序特性提升效率 - 把
print改为println,输出格式更规范
修改方案二:使用计数数组(更简洁高效)
由于输入范围固定为1-100,我们可以直接创建一个大小为101的数组(索引对应数字),每个位置存储对应数字的出现次数,这种方法无需排序,逻辑更简单:
完整代码示例:
import java.util.Scanner; public class CountOccur { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 索引0闲置,1-100对应输入的数字 int[] countArray = new int[101]; System.out.println("Enter some integers between 1 and 100 (0 when done): "); int userNum; do { userNum = input.nextInt(); if (userNum >= 1 && userNum <= 100) { // 对应数字的计数加1 countArray[userNum]++; } } while (userNum != 0); // 遍历计数数组,输出有出现记录的数字 for (int i = 1; i <= 100; i++) { if (countArray[i] > 0) { if (countArray[i] > 1) { System.out.println("The number " + i + " appears " + countArray[i] + " times."); } else { System.out.println("The number " + i + " appears " + countArray[i] + " time."); } } } input.close(); } }
优点:
- 无需存储所有输入数字,节省内存
- 逻辑直观,避免了排序和嵌套循环的复杂处理
- 天然不会出现重复输出问题,每个数字仅遍历一次
测试验证
用你的输入示例2 5 6 5 4 3 23 43 2 0,两种方案都会输出正确结果:
The number 2 appears 2 times.
The number 3 appears 1 time.
The number 4 appears 1 time.
The number 5 appears 2 times.
The number 6 appears 1 time.
The number 23 appears 1 time.
The number 43 appears 1 time.
内容的提问来源于stack exchange,提问作者user23465972
相关产品推荐
相关产品推荐

