简体   繁体   中英

How to Diagonally Check String in a 2D Char Array in Java (Eclipse)

I am getting a list of words as input from the user and storing their input in a String[] array. I then create a char[][] array called letterGrid which is filled with random letters and the words provided by the user. The user then has to enter a word that they want to find when the letterGrid is displayed on the console screen. The program will then check if the the entered word appears horizontally, vertically, or diagonally, and it will print out it s location. I have the checkHorizontal and checkDiagonal methods working fine, but I am having a problem at checkVertical. For example, my sample input of words was s location. I have the checkHorizontal and checkDiagonal methods working fine, but I am having a problem at checkVertical. For example, my sample input of words was s location. I have the checkHorizontal and checkDiagonal methods working fine, but I am having a problem at checkVertical. For example, my sample input of words was red, orange, yellow, green, blue, purple, rainbow , and colours.` Down below is the output grid:

单词搜索错误-控制台屏幕

As you can see, when I type in yellow (6 letters in length), the program outputs the location of the word, but then there is an out of bound error.

EDITED CODE

Here is the rest of the code upon the request of @Igor Khvostenkov:

 private String word; // This variable will be the user`s input when they chose to search for a word they have entered private int rowLocation; // This variable will represent the row number in which the word is at private int colLocation; // This variable will represent the column number in which the word is at // Create a method to compare the user`s word to the elements in the letter grid public void compare (String word) { for (int row = 0; row < letterGrid.length - 1; row++) { for (int col = 0; col < letterGrid[row].length - 1; col++) { if (letterGrid[row][col] == word.charAt(0)) { rowLocation = row; colLocation = col; wordContains(); // Call on method to see if the word entered by the user appears horizontally, vertically, or diagonally }//end of if }//end of inner for loop }//end of outer for loop }//end of compare(word) // Create a method that will check the direction of the user`s word input public void wordContains() { checkHorizontal(); // Checking if the word appears horizontally checkVertical(); // Checking id the word appears vertically checkDiagonal(); // Checking if the word appears diagonally }//end of wordContains() // Create a method to check if the user`s word appears HORIZONTALLY in the letter grid public void checkHorizontal() { for (int i = 1; i < (word.length()); i++) { if (colLocation + i > letterGrid[0].length - 1) { return; } else if(letterGrid[rowLocation][colLocation + i] != word.charAt(i)) { return; }//end of if..else if }//end of for loop System.out.println(word + " found horizontally at row " + rowLocation + " and column " + colLocation); // Word found!! System.out.println(); return; }//end of checkHorizontal() // Create a method to check if the user`s word appears VERTICALLY in the letter grid public void checkVertical() { for (int i = 1; i < (word.length()); i++) { if (rowLocation + i > letterGrid.length - 1 && colLocation + i > letterGrid[0].length) { return; } else if (letterGrid[rowLocation + i][colLocation] != word.charAt(i)) { return; }//end of if..else if }//end of for loop System.out.println(word + " found vertically at row " + rowLocation + " and column " + colLocation); // Word found!! System.out.println(); }//end of checkVertical() // Create a method to check if the user`s word appears DIAGONALLY in the letter grid public void checkDiagonal() { for (int i = 1; i < (word.length()); i++) { if (colLocation + i > letterGrid[0].length - 1 || rowLocation + i > letterGrid.length - 1) { return; } else if (letterGrid[rowLocation + i][colLocation + i] != word.charAt(i)) { return; }//end of if..else if }//end of for loop System.out.println(word + " found diagonally at row " + rowLocation + " and column " + colLocation); // Word found!! System.out.println(""); }//end of checkDiagonal() 

I can t seem to know why this is happening, and how I can fix this. I am not that familiar with ArrayIndexOutofBounds Exceptions as I barely go through them, but recently I have been and I t seem to know why this is happening, and how I can fix this. I am not that familiar with ArrayIndexOutofBounds Exceptions as I barely go through them, but recently I have been and I ve been trying to understand the problem and look for ways to help me solve it.

The problem in the code is in your if-condition in checkVertical() that the row and column could be either first or last, but you should check row or column. Your example with yellow failed due to first code find Y in the first row and second column and then continue scan and finally, it finds Y in the last row and checks rowLocation + i > letterGrid.length - 1 && colLocation + i > letterGrid[0].length which skipped, then calls else which adds 1 to the row, and as a result out of bound the array. This should work:

 public void checkVertical() {

        for (int i = 1; i < (word.length()); i++) {

            if (rowLocation + i > letterGrid.length - 1 || colLocation + i > letterGrid[0].length) {

                return;

            } else if (letterGrid[rowLocation + i][colLocation] != word.charAt(i)) {

                return;

            }//end of if..else if

        }//end of for loop

        System.out.println(word + " found vertically at row " + rowLocation + " and column " + colLocation); // Word found!!
        System.out.println();

    }//end of checkVertical()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM