2016-11-12 2 views
1

Я занимаюсь поиском слов, и я думаю, что я близок к выяснению этого, но у меня все еще есть несколько проблем. Моя программа читается в текстовом файле, состоящем из строк и столбцов букв, и превращает его в массив 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, поэтому он просто заканчивается бесконечным циклом. Иногда даже если слово можно найти как по горизонтали, так и по вертикали, программа только говорит, что она найдена по горизонтали. Кроме того, в некоторых случаях он печатает, где слово было найдено два раза.

Любая помощь в определении того, что не так, была бы весьма признательна. Благодаря!

ответ

0

Похоже, что ваша завершающая строка quit, а не end. Кроме того, причина, по которой он находит ошибочные слова, заключается в том, что вы принимаете targetWord, даже если соответствует только один символ.

public void checkRight() 
{ 
    for(int i = 1; i < (targetWord.length()); i++) 
    { 
     if(colLocation + i > array.length - 1) 
     { 
      return; 
     } 

     else if(array[rowLocation][colLocation + i] == targetWord.charAt(i)) 
     { 
      System.out.println(targetWord + " found horizontally at row " + rowLocation + " and column " + colLocation); 
      System.out.println(); 
     } 
    } 

} 

То есть, если array[rowLocation][colLocation+i] == targetWord.charAt(i), то вы автоматически принимаете это слово. Это неверно, потому что вы должны проверить, что все буквы соответствуют каждой позиции.

+0

Спасибо, я сменил свой код и теперь проверяет, не имеет ли символ в определенной позиции 'targetWord.charAt (i)' и завершает цикл с помощью оператора return. Я перенесла оператор, который печатает местоположение найденного слова вне цикла for, поэтому теперь он выполняется только в том случае, если цикл for не был прерван. Я изменил условие do-while loop на 'while (! TargetWord.equals (" end "));'. – Bluasul

+0

Правильные и диагональные методы отлично работают при проверке самостоятельно или вместе, но метод «checkDown» выполняется, даже если я печатаю конец и выдаю ошибку за пределами границ. Любая идея о том, как это исправить? Я обновлю свой код, чтобы вы могли лучше видеть изменения – Bluasul