二维数组词搜索
2D array word search
我正在尝试使用用户输入从文本文件中搜索二维数组,但到目前为止,我要么最终发现该词不在二维数组中(它确实存在),要么最终显示为无论用户输入什么都在数组中。例如,单词 red 在数组中,但它多次输出它不是而不是一次,或者它多次输出该单词在数组中。我输入的单词文件在前两个数字用于二维数组大小的位置下方。任何人都可以给我一些关于我做错了什么的提示,因为我被卡住了,我需要重新审视这个问题。
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;
}
}
在if
语句中放一个return;
语句,这样它在找到匹配项后就不会继续迭代了。可以在循环结束后显示没有找到
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;
}
}
我正在尝试使用用户输入从文本文件中搜索二维数组,但到目前为止,我要么最终发现该词不在二维数组中(它确实存在),要么最终显示为无论用户输入什么都在数组中。例如,单词 red 在数组中,但它多次输出它不是而不是一次,或者它多次输出该单词在数组中。我输入的单词文件在前两个数字用于二维数组大小的位置下方。任何人都可以给我一些关于我做错了什么的提示,因为我被卡住了,我需要重新审视这个问题。
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;
}
}
在if
语句中放一个return;
语句,这样它在找到匹配项后就不会继续迭代了。可以在循环结束后显示没有找到
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;
}
}