Java生成1-6随机数并检测连续重复值问题求助及报错修复
问题分析与解决方案
嘿,我来帮你搞定这个问题!你遇到的ArrayIndexOutOfBoundsException: 20,本质是因为原代码在判断连续重复数字时,完全没考虑数组的边界——比如当i走到17的时候,i+4就是21,直接超出了数组的索引范围(数组是0到19,最大索引是19)。另外原代码里的while循环和i的多次自增逻辑也很乱,很容易导致元素重复处理或者遗漏。
修复后的原逻辑版本
先给你一个修复好的版本,解决越界问题同时理顺逻辑:
import java.util.Random; public class Ushtr3 { public static void main(String[] args) { int[] a = new int[20]; Random nr = new Random(); // 生成20个1-6的随机数 for (int i = 0; i < a.length; i++) { a[i] = 1 + nr.nextInt(6); } // 打印原始序列 System.out.println("生成的随机数序列:"); for (int num : a) { System.out.print(num); } System.out.println("\n标记连续重复后的序列:"); int i = 0; while (i < a.length) { int currentNum = a[i]; int consecutiveCount = 1; // 先统计当前数字连续出现的次数 while (i + consecutiveCount < a.length && a[i + consecutiveCount] == currentNum) { consecutiveCount++; } // 根据连续次数决定输出格式 if (consecutiveCount >= 2) { System.out.print("("); for (int j = 0; j < consecutiveCount; j++) { System.out.print(currentNum); } System.out.print(")"); } else { System.out.print(currentNum); } // 跳过已经处理完的连续元素,避免重复循环 i += consecutiveCount; } } }
这个版本的思路很直观:先统计当前位置开始连续相等的数字个数,再根据个数选择输出方式,最后直接跳到下一个不同的数字位置,完全不会碰数组边界,逻辑也清晰多了。
更简洁的实现方式(Java 11+适用)
如果你的Java版本在11以上,可以用String.repeat()让代码更紧凑,再配合StringBuilder拼接结果,可读性拉满:
import java.util.Random; public class Ushtr3 { public static void main(String[] args) { int[] a = new int[20]; Random nr = new Random(); // 填充随机数 for (int i = 0; i < a.length; i++) { a[i] = 1 + nr.nextInt(6); } // 打印原始序列 System.out.println("生成的随机数序列:"); for (int num : a) { System.out.print(num); } System.out.println(); StringBuilder result = new StringBuilder(); int i = 0; while (i < a.length) { int current = a[i]; int startIdx = i; // 找到当前连续数字的结束位置 while (i < a.length && a[i] == current) { i++; } // 判断是否是2个及以上连续重复 if (i - startIdx >= 2) { result.append("(") .append(String.valueOf(current).repeat(i - startIdx)) .append(")"); } else { result.append(current); } } // 打印最终结果 System.out.println("标记连续重复后的序列:"); System.out.println(result); } }
这个版本用String.repeat()直接生成连续的数字字符串,不用嵌套循环拼字符串,代码更简洁,维护起来也方便。
核心优化要点
- 避免边界越界:不再直接访问
i+n的数组元素,而是先统计连续长度,确保所有数组访问都在合法索引范围内 - 减少冗余循环:一次性处理完一整段连续重复的数字,不用反复判断每个位置
- 逻辑清晰:把“统计连续长度”和“输出格式”拆分开,后续要修改规则(比如要求连续3个才标记)只需要改个数字就行
内容的提问来源于stack exchange,提问作者Endra
相关产品推荐
相关产品推荐

