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

Java生成带随机起点终点的二维数组时打印出现越界内容的问题

Java生成带随机起点终点的二维数组时打印出现越界内容的问题

看起来你遇到的不是数组真的越界问题,而是打印逻辑的小错误导致排版错位,让你误以为有数字超出了二维数组范围。我们来拆解一下问题:

问题根源

你当前的打印逻辑是:先打印每个数组元素M[i][j],然后判断如果是起点/终点,再额外打印{S}或{E}。这就会导致:当某个位置是起点或终点时,你会在同一位置输出两个内容(数组值+标识),后续元素的打印就会被挤到后面,看起来像是数组越界多出来的数字,但实际上你的二维数组M本身是完全正常的a×a结构。

比如你示例里的第二行,原本是第2个位置(索引1)是起点,你先打印了2,然后又打印了{S},这一行就多了一个内容,后面的1、2就被推到更右边,最后看起来多了一个2——其实那个2是原本该行的最后一个元素,只是因为前面多输出了内容,排版错位了。

修正方案

我们需要调整打印逻辑:对于每个位置,先判断它是起点、终点还是普通元素,然后只输出对应内容(避免重复输出)。如果想保留数组值+标识的组合,也可以统一处理,保证每个位置的输出长度一致,排版更整齐。

修正后的打印代码

for (int i = 0; i < a; i++) {
    for (int j = 0; j < a; j++) {
        String displayContent;
        // 判断当前位置是起点、终点还是普通元素
        if (row_start == i && col_start == j) {
            displayContent = "{S}"; // 如果你想同时显示数字,可以写成 M[i][j] + "{S}"
        } else if (row_end == i && col_end == j) {
            displayContent = "{E}"; // 同理,也可以写成 M[i][j] + "{E}"
        } else {
            displayContent = String.valueOf(M[i][j]);
        }
        // 用格式化输出保证每个元素排版对齐(可选,但推荐)
        System.out.printf("%6s", displayContent);
    }
    System.out.println(); // 换行
}

额外优化建议

  • 可以用printf的格式化输出代替print,让每个元素占用相同宽度,避免排版混乱,比如上面的%6s表示每个内容占6个字符宽度。
  • 如果希望起点/终点保留原来的地形值(比如草地1+{S}),可以把displayContent改成M[i][j] + "{S}",这样能同时看到地形类型和起点标识。
  • 注意起点和终点可能会重合的情况,如果需要避免,可以在生成终点坐标时加个判断:
// 确保终点和起点不重合
do {
    row_end = rand.nextInt(a);
    col_end = rand.nextInt(a);
} while (row_end == row_start && col_end == col_start);

验证效果

修正后,每个行的元素数量都会严格等于a,不会出现额外的数字,排版也会整齐很多,比如类似这样的输出:

1      0      4      0
     2   {S}      1      2
     4      4   {E}      0
     2      0      3      3

备注:内容来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:12:33