2013-02-15 111 views
2

我正在嘗試爲類作業創建一個簡單的單詞搜索,並且我設法弄清楚瞭如何搜索東(從左到右)和西(從右到左)。但是我在試圖找出如何向南搜索(從上到下)時遇到了困難。在java 2d數組中搜索字詞

我有一個文件讀取的代碼,但第二個文件返回一個ArrayIndexOutOfBoundsException。我的代碼中是否有特定的內容會使其不可擴展?

校正代碼看起來是這樣的:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

import wordSeek.GameBoard; 

public class WordGame { 

    private char[][] letters; 
    GameBoard gb; 

    public static void main(String[] args) { 
     WordGame wg = new WordGame(); 
     wg.play(); 

    } 

    public WordGame() { 
     letters = readLettersFromFile(); 
     gb = new GameBoard(letters); 

    } 

    private void play() { 
     Scanner s = new Scanner(System.in); 
     String word; 

     do { 
      System.out.println("Enter word to find: "); 
      word = s.next(); 

      // reset all highlighted tiles 
      gb.reset(); 

      search(word); 

     } while (!word.equals("QUIT")); 

     gb.dispose(); 
    } 

    // Nothing to be done above 
    // Complete all the methods below 

    private char[][] readLettersFromFile() { 
     // From the data in the file Letters.txt determine the size (number of 
     // rows and number of columns) for the letters array 

     int rowCount = 0; 
     int colCount = 0; 
     char c; 

     File file = new File("resources/Places.txt"); 

     Scanner fileScanner = null; 
     try { 
      fileScanner = new Scanner(file); 
      } 
     catch (FileNotFoundException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     ArrayList<String> data = new ArrayList<String>(); 

     while(fileScanner.hasNextLine()) 
     { 
      String line = fileScanner.nextLine(); 
      data.add(line); 
     } 

     fileScanner.close(); 
     rowCount = data.size(); 
     colCount = data.get(0).trim().length()/2+1; 

     // Instantiate a two dimensional array of characters of the appropriate 
     // size 

     letters = new char [rowCount][colCount]; 

     // Populate the array with the letters in Letters.txt 
     for (int i = 0; i < rowCount; i++) { 
      String line = data.get(i); 
      int pos = 0; 
      for (int j = 0; j < colCount; j++) { 
       letters[i][j] = line.charAt(pos); 
       pos += 2; 
      } 

     } 

     // return the array 

     return letters; 

    } 

    private void search(String word) { 
     System.out.println("Searching for " + word); 

     //Call the other search methods below as needed 
     searchIterativeEast(word); 
     searchIterativeWest(word); 
     searchIterativeSouth(word); 
     searchIterativeNorth(word); 
    } 

    //The following four methods must employ ITERATION to search the game board 
    private boolean searchIterativeEast(String word) { 
     int k = 0; 

     for (int i = 0; i < letters.length; i++) 
     { 
      for (int j = 0; j < letters[i].length; j++) { 
       if (word.charAt(k) == letters[i][j]) { 
        k++; 
       } 
       else { 
        k = 0; 
       } 
       if (k == word.length()) { 
        for (int col = j - k + 1; col <= j; col++) { 
         gb.highlight(i, col); 
        } 

        return true; 
       } 
      } 
     } 

     return false; 
    } 

    private boolean searchIterativeWest(String word) { 

      String reversedWord = ""; 
      for (int i = word.length() - 1; i != -1; i--) 
      { 
       reversedWord += word.charAt(i); 
      } 

      int k = 0; 

      for (int i = 0; i < letters.length; i++) 
      { 
       for (int j = 0; j < letters[i].length; j++) { 
        if (reversedWord.charAt(k) == letters[i][j]) { 
         k++; 
        } 
        else { 
         k = 0; 
        } 
        if (k == reversedWord.length()) { 
         for (int col = j - k + 1; col <= j; col++) { 
          gb.highlight(i, col); 
         } 

         return true; 
        } 
       } 
      } 

      return false; 

    } 

    private boolean searchIterativeSouth(String word) { 
     int k = 0; 
     int store = letters[0].length; 

     for (int j = 0; j < letters[store].length; j++) 
     { 
      for (int i = 0; i < letters.length; i++) 
      { 
       if (word.charAt(k) == letters[i][j]) 
       { 
        k++; 
       } 
       else 
       { 
        k = 0; 
       } 
       if (k == word.length()) 
       { 
        for(int row = i-k+1 ; row <= i; row++) 
        { 
         gb.highlight(row, j); 
        } 
        return true; 
       } 
      } 
     } 

     return false; 
    } 

    private boolean searchIterativeNorth(String word) { 

     String reversedWord = ""; 
     for (int i = word.length() - 1; i != -1; i--) 
     { 
      reversedWord += word.charAt(i); 
     } 

     int k = 0; 
     int store = 0; 

     for(int i = 0; i < letters.length; i++) 
     { 
      store = letters[i].length; 
     } 

     for (int j = 0; j < letters[store].length; j++) 
     { 
      for (int i = 0; i < letters.length; i++) 
      { 
       if (reversedWord.charAt(k) == letters[i][j]) 
       { 
        k++; 
       } 
       else 
       { 
        k = 0; 
       } 
       if (k == reversedWord.length()) 
       { 
        for(int row = i-k+1 ; row <= i; row++) 
        { 
         gb.highlight(row, j); 
        } 
        return true; 
       } 
      } 
     } 

     return false; 
    } 

爲所述第一文件(Animals.txt)的遊戲鍵盤看起來像:5X4 2D陣列

X C A T 
P A L Q 
I R B U 
G P X N 
G O D W 

輸出亮點CARP。

的遊戲鍵盤的第二個文件(Places.txt)是這樣的:11×15二維數組

O M J G D A X V C S Q N K I F 
D A X V T Q O M J H A A H F C 
A Y W U R P N L F E I T A L Y 
J N H N E T H E R L A N D S F 
D B I Z X V T O A R Q O A Y K 
M K I A H F K R N O D B N N I 
N Z Y W P H T V C G C T A A N 
R A Q O T S N L E K K I C M G 
I H P U U F D C A Z D O X R D 
X W O A L E U Z E N E V N E O 
V S U S J R Q L I Z A R B G M 
而不是
+0

什麼是字母?它是一個n×n矩陣嗎?或者只是一個數組數組? – 2013-02-15 05:19:56

+0

字母是一個字符[] [] – 2013-02-15 05:21:32

+1

好的,這裏有一個提示。你的外循環應該遍歷列,並且內循環應該遍歷行。這只是與通常迭代數組數組相反的方式。所以,試着將字母[i] [j]'改成'字母[j] [i]'。我相信你會得到一個例外。您需要解決該異常。 – 2013-02-15 05:23:25

回答

1

return語句去外面的循環,否則你只會突出顯示第一個字母。

... 
for (int row = j-k+1; row <=i; row++) 
    { 
     //gb.highlight() just calls a method that highlights the letters. 
     gb.highlight(row, j); 
     //return true; 
    } 
return true; 
... 
1
for (int j = 0; j < letters[i].length; j++) 

for (int j = 0; j < letters.length; j++) 
+0

修復了ArrayIndexOutOfBoundsException錯誤,我一直在玩代碼,以至於導致錯誤。 – 2013-02-15 05:25:06

+1

@Achintya。這本身並不能解決問題。除了改變循環條件之外,還有更多的問題。但是,我希望OP能夠弄明白。 – 2013-02-15 05:28:56