
本文详解 Java 中打印二维数组时避免重复输出的关键逻辑:当单元格为起点或终点位置时,应仅打印 {S} 或 {E},而非同时输出原数值,否则会导致每行多出冗余数字。
本文详解 java 中打印二维数组时避免重复输出的关键逻辑:当单元格为起点或终点位置时,应仅打印 `{s}` 或 `{e}`,而非同时输出原数值,否则会导致每行多出冗余数字。
在 Java 中打印带语义标记(如起点 {S}、终点 {E})的二维数组时,一个常见误区是在遍历每个元素时无条件打印原始值,再额外判断是否叠加标记——这会导致同一位置被打印两次(如 2 和 {S} 并列),破坏网格结构,使输出错位、难以解析。
根本原因在于原代码中使用了独立的 if 判断:
System.out.print(" " + M[i][j] + "\t"); // ❌ 总是先打印数字
if(row_start == i && col_start == j) {
System.out.print("{S}" + "\t"); // ❌ 再追加标记 → 同一格输出两次
}
if(row_end == i && col_end == j) {
System.out.print("{E}" + "\t");
}这违反了“每个坐标 (i, j) 仅输出一个内容”的基本原则。
✅ 正确做法是采用互斥分支(if-else if-else),确保每个位置有且仅有一个输出:
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {
if (row_start == i && col_start == j) {
System.out.print("{S}\t");
} else if (row_end == i && col_end == j) {
System.out.print("{E}\t");
} else {
System.out.print(M[i][j] + "\t");
}
}
System.out.println(); // 换行(推荐用 println() 替代 print("\n"))
}? 关键注意事项:
- 顺序不可颠倒:必须先检查 {S} 和 {E},再处理普通单元格;若 {S} 和 {E} 坐标重合(虽在 A* 场景中罕见),需根据业务逻辑明确优先级(例如优先显示 {S})。
- 制表符一致性:所有分支均使用 \t 对齐,避免因空格数量差异导致列错位。
- 边界安全:本例假设 row_start/col_start 与 row_end/col_end 均在 [0, a) 范围内(由 rand.nextInt(a) 保证),实际工程中建议增加断言或日志校验。
- 可扩展性提示:若后续需支持障碍物符号(如 #)、路径标记(*)等,可将该逻辑封装为 getCellValue(i, j) 方法,提升可读性与复用性。
通过这一逻辑重构,输出将严格保持 a × a 网格结构,例如 4×4 数组的典型正确结果如下:
1 0 4 0
2 {S} 1 2
4 4 {E} 0
2 0 3 3 清晰、对齐、语义准确——这是实现 A* 可视化调试与算法验证的基础保障。











