You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:36:57