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
相关产品推荐
相关产品推荐

