2016-11-29 136 views
0

我正在尝试使用用户输入从文本文件中搜索二维数组,但到目前为止,我要么终于得到该单词不在二维数组中(它是)还是它结束说什么用户输入是在阵列中。例如,红色字在数组中,但它输出多次而不是一次,或者输出该单词在数组中多次。我输入的单词文件位于前两个数字用于2D数组大小的位置。任何人都可以给我一些暗示我做错了什么,因为我需要一个新的眼睛,因为我卡住了。二维数组字搜索

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 

我的代码如下,如果我需要清理一下代码,只是让我知道,因为我敢肯定,有些事情可能有点难以理解,因为我一直工作在此的某个时候。

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; 
} 

} 
+0

而不是压制的警告,你应该使用[尝试 - 与资源(https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)。 – 4castle

+0

好吧,我会试试 –

回答

0

放一个return;声明if语句中,这样它不会继续迭代找到一个匹配之后。您可以显示循环结束后未找到它。

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"); 
} 

要检查单词是否在二维数组中,您只需要一个循环。例如,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; 
    } 
}  
+0

你真棒,因为它解决了我收到的重复消息错误。我仍在努力尝试让方法正确地找到用户输入的单词,你有什么提示可以使用吗? –

+0

当然,我已经包括你如何做'检查'。除了第一个“if”语句和“puzzle”索引之外,其他语言将是相同的。 – 4castle