Я занимаюсь поиском слов, и я думаю, что я близок к выяснению этого, но у меня все еще есть несколько проблем. Моя программа читается в текстовом файле, состоящем из строк и столбцов букв, и превращает его в массив 2d char в отдельный класс. Это мой фактический поиск слова класс:Java: 2D char array search
import java.util.Scanner;
public class WordSearch
{
private char[][] array;
private String targetWord;
private int rowLocation;
private int colLocation;
public WordSearch(char[][] inArray)
{
array = inArray;
}
public void play()
{
do{
for (int row = 0; row < array.length; row++)
{
for (int col = 0; col < array[row].length; col++)
{
System.out.print(array[row][col]);
}
System.out.println();
}
System.out.println();
Scanner input = new Scanner(System.in);
System.out.println("What word would you like to search for? Type end to quit: ");
targetWord = input.nextLine();
System.out.println("Typed in: " + targetWord);
System.out.println();
compareFirst(targetWord);
} while (!targetWord.equals("end"));
}
public void compareFirst(String inWord)
{
for (int row = 0; row < array.length; row++)
{
for (int col = 0; col < array[row].length; col++)
{
if(array[row][col] == inWord.charAt(0))
{
rowLocation = row;
colLocation = col;
suspectAnalysis();
}
}
}
}
public void suspectAnalysis()
{
checkRight();
checkDown();
checkDiagonal();
}
public void checkRight()
{
for(int i = 1; i < (targetWord.length()); i++)
{
if(colLocation + i > array[0].length - 1)
{
return;
}
else if(array[rowLocation][colLocation + i] != targetWord.charAt(i))
{
return;
}
}
System.out.println(targetWord + " found horizontally at row " + rowLocation + " and column " + colLocation);
System.out.println();
return;
}
public void checkDown()
{
for(int i = 1; i < (targetWord.length()); i++)
{
if(rowLocation + i > array.length - 1 && colLocation + i > array[0].length - 1)
{
return;
}
else if(array[rowLocation + i][colLocation] != targetWord.charAt(i))
{
return;
}
}
System.out.println(targetWord + " found vertically at row " + rowLocation + " and column " + colLocation);
System.out.println();
}
public void checkDiagonal()
{
for(int i = 1; i < (targetWord.length()); i++)
{
if(colLocation + i > array[0].length - 1 || rowLocation + i > array.length - 1)
{
return;
}
else if(array[rowLocation + i][colLocation + i] != targetWord.charAt(i))
{
return;
}
}
System.out.println(targetWord + " found diagonally at row " + rowLocation + " and column " + colLocation);
System.out.println();
}
}
Таким образом, как правило, удается найти слова во всех трех направлениях, но и «находит» слова, когда он находит первую букву и любую другую букву после него. Он также находит слово «конец», которое, как предполагается, завершает цикл do-while, поэтому он просто заканчивается бесконечным циклом. Иногда даже если слово можно найти как по горизонтали, так и по вертикали, программа только говорит, что она найдена по горизонтали. Кроме того, в некоторых случаях он печатает, где слово было найдено два раза.
Любая помощь в определении того, что не так, была бы весьма признательна. Благодаря!
Спасибо, я сменил свой код и теперь проверяет, не имеет ли символ в определенной позиции 'targetWord.charAt (i)' и завершает цикл с помощью оператора return. Я перенесла оператор, который печатает местоположение найденного слова вне цикла for, поэтому теперь он выполняется только в том случае, если цикл for не был прерван. Я изменил условие do-while loop на 'while (! TargetWord.equals (" end "));'. – Bluasul
Правильные и диагональные методы отлично работают при проверке самостоятельно или вместе, но метод «checkDown» выполняется, даже если я печатаю конец и выдаю ошибку за пределами границ. Любая идея о том, как это исправить? Я обновлю свой код, чтобы вы могли лучше видеть изменения – Bluasul