如何判断单词能否完整放入二维数组?数组越界问题求助
解决二维数组添加单词的越界问题
原代码存在的问题
- 越界判断逻辑错误:
- 水平添加(
position=0)时,用y + 1 >= board[x].length逐个字符判断的时机不对,且未提前校验整个单词的放置范围是否超出列数,导致部分字符直接丢失。 - 垂直添加(
position=1)时,错误使用board[y].length获取行数,应该直接使用总行数rows;同时同样未提前校验单词整体的行范围。
- 水平添加(
- 无效处理逻辑:遇到越界仅用
continue跳过,没有提前阻止无效添加,导致单词不完整。
解决方案
新增有效性校验方法,在添加单词前先判断是否能完整放入数组;同时修正原代码的逻辑错误,确保只有校验通过时才执行添加操作。
修改后的完整代码
public class WordSearch { private static final int ROWS = 5; private static final int COLUMNS = 10; private char[][] board = new char[ROWS][COLUMNS]; public WordSearch() { // 初始化二维数组为* for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLUMNS; col++) { board[row][col] = '*'; } } } // 校验单词是否可以从(x,y)位置按指定方向完整放入 private boolean canAddWord(String word, int position, int x, int y) { if (word == null || word.isEmpty()) { return false; } int wordLength = word.length(); // 先校验起始坐标是否在数组合法范围内 if (x < 0 || x >= ROWS || y < 0 || y >= COLUMNS) { return false; } switch (position) { case 0: // 水平方向(从左到右) // 检查单词末尾列是否超出数组总列数 return y + wordLength <= COLUMNS; case 1: // 垂直方向(从上到下) // 检查单词末尾行是否超出数组总行数 return x + wordLength <= ROWS; default: return false; } } public void addWord(String word, int position, int x, int y) { // 先执行有效性校验,不合法直接提示并返回 if (!canAddWord(word, position, x, y)) { System.out.println("无法添加单词:位置越界或方向无效"); return; } int wordLength = word.length(); switch (position) { case 0: // 水平添加 for (int i = 0; i < wordLength; i++) { board[x][y + i] = word.charAt(i); } break; case 1: // 垂直添加 for (int i = 0; i < wordLength; i++) { board[x + i][y] = word.charAt(i); } break; default: System.out.println("请输入0(水平)或1(垂直)指定添加方向"); } } // 打印二维数组,方便查看结果 public void printBoard() { for (char[] row : board) { System.out.println(new String(row)); } } public static void main(String[] args) { WordSearch ws = new WordSearch(); // 尝试在(2,5)位置水平添加"schedule"(5+8=13>10,会提示无法添加) ws.addWord("schedule", 0, 2, 5); // 在(1,2)位置水平添加"schedule"(2+8=10,刚好可以放入) ws.addWord("schedule", 0, 1, 2); ws.printBoard(); } }
关键修改说明
- 把
rows和columns改为私有常量(符合Java命名规范),增强封装性。 - 新增
canAddWord方法,从三个维度校验:单词非空、起始坐标合法、单词整体放置后不越界。 - 修改
addWord方法,先执行校验,不合法直接终止操作并提示;校验通过后直接按位置填充字符,避免循环中的错误判断。 - 新增
printBoard方法,方便直观查看数组内容。
内容的提问来源于stack exchange,提问作者user13084927
相关产品推荐
相关产品推荐

