简体   繁体   English

二维阵列词搜索

[英]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. 我正在尝试使用用户输入从文本文件中搜索2D数组,但到目前为止,我要么最终得到单词不在2D数组中(而是),要么最终说出了用户输入的内容在数组中。 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. 例如,单词red在数组中,但是它输出的次数是它的多次而不是一次,或者它输出单词在数组中的次数是多次。 The word file that I input is below where the first two numbers are used for the size of the 2D array. 我输入的字文件在下面,其中前两个数字用于2D数组的大小。 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;
}

}

Put a return; return; statement inside the if statement so that it doesn't continue to iterate after it finds a match. if语句中的语句,以便在找到匹配项后不会继续进行迭代。 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. 要检查单词是否在2D数组中,您只需要一个循环即可。 For example, checkUp : 例如, 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;
    }
}    

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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