General Antrhax General Antrhax - 5 days ago 5
Java Question

2D array word search

I'm trying to search a 2D array from a text file using user input but so far I've either end up getting that the word is not in the 2D array (which it is) or it ends up saying that whatever the user inputs is in the array. For instance the word red is in array but it outputs multiple times that its not instead of just once or it outputs that the word is in the array multiple times. The word file that I input is below where the first two numbers are used for the size of the 2D array. Can anyone give me some hints on what I'm doing wrong as I need a fresh set of eyes on this as I'm stuck.

6 6

d e v o l g
r e d p h k
q c h z j c
p o a a f o
v a m m n l
q t f o x b


my code is as follows, if I need to clear up the code a bit just let me know as I'm sure somethings might be a little hard to understand as I've been working on this for sometime.

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;

public class WordSearch {

public static void main(String[] args) {

char[][] puzzle = null;
puzzle = fill(puzzle);


// create scanner for user input to take the word for searching

@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
System.out.print("Enter the word you wish to search for (limit of four characters): ");
String wordToFind = in.nextLine();
play(wordToFind, puzzle);
printPuzzle(puzzle);
}

public static char[][] fill(char[][] puzzle) {

// file Reading

boolean flag = true;// boolean flag is used for prompting user if the file location is incorrect
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
while (flag) {
System.out.print("Please input the text file locaiton: ");

String fileLoc = in.nextLine();

try {

File f = new File(fileLoc);
@SuppressWarnings("resource")
Scanner fileRead = new Scanner(f);

int row = fileRead.nextInt();// i
int col = fileRead.nextInt();// j

puzzle = new char[row][col];

for (int i = 0; i < puzzle.length; i++) {
for (int j = 0; j < puzzle[0].length; j++) {
puzzle[i][j] = fileRead.next().charAt(0);

}
}

flag = false;// breaks the loop so the user isn't re-prompt for
// file location
} catch (FileNotFoundException e) {

}

}
return puzzle;
}

public static void printPuzzle(char[][] puzzle) {
for (int i = 0; i < puzzle.length; i++) {
for (int j = 0; j < puzzle[0].length; j++) {
System.out.print(puzzle[i][j] + " ");
}
System.out.println();
}
}

public static void play(String word, char[][] puzzle) {
for (int i = 0; i < puzzle.length; i++) {
for (int j = 0; j < puzzle[0].length; j++) {

if (checkUp(puzzle, word, i, j) == true)
{
System.out.println("The word " + word + " was found by the method checkUp beginnning in cell ");


}
if ( checkDown(puzzle, word, i, j) == true)
{
System.out.println("The word " + word + " was found by the method checkDown beginning in cell");

}
if(checkRight(puzzle, word, i, j) == true)
{
System.out.println("The word " + word + " was found by the method checkDown beginning in cell");

}
if(checkLeft(puzzle, word, i, j) == true)
{
System.out.println("The word " + word + " was found by the method checkLeft beginning in cell");

}

if(checkUp(puzzle, word, i, j) != true && checkDown(puzzle, word, i, j) != true && checkRight(puzzle, word, i, j) != true && checkLeft(puzzle, word, i, j) != true)
{
System.out.println("The word " + word + " was not in the puzzle");
break;

}


}
}
}
/**
* searches for the user defined word going up
* @param puzzle
* @param word
* @param i
* @param j
* @return
*/
public static boolean checkUp(char[][] puzzle, String word, int i, int j) {
char search = word.charAt(0);
for ( i = 0; i < puzzle.length; i++) {
for ( j = 0; j < puzzle[0].length; j++) {
if (search != puzzle[i][j]) {
return false;

}

else {
i = i - 1;
if (i < 0) {
return false;
}
}
}

}
return true;
}



/**
* searches for the user defined word going down
* @param puzzle
* @param word
* @param i
* @param j
* @return
*/
public static boolean checkDown(char[][] puzzle, String word, int i, int j) {
char search = word.charAt(0);
for ( i = 0; i < puzzle.length; i++) {
for ( j = 0; j < puzzle[0].length; j++) {
if (search != puzzle[i][j]) {
return false;

}

else {
i = i + 1;
if (i < 0) {
return false;
}
}
}

}
return true;
}

/**
* searches for the user defined word going left
* @param puzzle
* @param word
* @param i
* @param j
* @return
*/
public static boolean checkLeft(char[][] puzzle, String word, int i, int j) {
char search = word.charAt(0);
for ( i = 0; i < puzzle.length; i++) {
for ( j = 0; j < puzzle[0].length; j++) {
if (search != puzzle[i][j]) {
return false;

}

else {
j = j - 1;
if (j < 0) {
return false;
}
}
}

}
return true;
}

/**
* this method will return true if the user defined word is found going right
* @param puzzle
* @param word
* @param i
* @param j
* @return
*/
public static boolean checkRight(char[][] puzzle, String word, int i, int j) {
char search = word.charAt(0);
for ( i = 0; i < puzzle.length; i++) {
for ( j = 0; j < puzzle[0].length; j++) {
if (search != puzzle[i][j]) {
return false;

}

else {
j = j + 1;
if (j < 0) {
return false;
}
}
}

}
return true;
}

}

Answer

Put a return; statement inside the if statement so that it doesn't continue to iterate after it finds a match. You can display that it was not found after the loop is finished.

public static void play(String word, char[][] puzzle) {
    String foundMessage = "The word %s was found by the method %s beginnning in cell%n";
    for (int i = 0; i < puzzle.length; i++) {
        for (int j = 0; j < puzzle[0].length; j++) {
            if (checkUp(puzzle, word, i, j)) {
                System.out.printf(foundMessage, word, "checkUp");
                return;
            } else if (checkDown(puzzle, word, i, j)) {
                System.out.printf(foundMessage, word, "checkDown");
                return;
            } else if (checkRight(puzzle, word, i, j)) {
                System.out.printf(foundMessage, word, "checkRight");
                return;
            } else if (checkLeft(puzzle, word, i, j)) {
                System.out.printf(foundMessage, word, "checkLeft");
                return;
            }
        }
    }
    System.out.println("The word " + word + " was not in the puzzle");
}

To check that a word is in the 2D array, you only need a single loop. For example, checkUp:

public static boolean checkUp(char[][] puzzle, String word, int i, int j) {
    if (i - word.length() >= 0) {
        for (int offset = 0; offset < word.length(); offset++) {
            if (puzzle[i - offset][j] != word.charAt(offset)) {
                return false;
            }
        }
        return true;
    } else {
        return false;
    }
}    
Comments