2014-10-10 13 views
-1

所以我有一個java中的多維數組,其中包含一個字符網格。我試圖將字符串匹配到網格中的字符。到目前爲止,我已經實現了從左到右,從右到左,從上到下,從下到上的搜索。他們工作,但不是所有的時間。我在java中查找多維字符數組中的字符串,但是我的搜索在不同字詞的不同字符後停止。爲什麼?

我遇到的問題是讓我們說例如我正在從左到右搜索一個字符串「ALGOS」,它在網格中。它找到一個A,然後找到另一個A,然後找到一個L,然後停止。它應該找到一個A,則L,G,O,S。我得到的錯誤如下:

A Found at: [0, 0] 
A Found at: [1, 4] 
L Found at: [1, 5] 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8 
    at WordFind00.findWord(WordFind00.java:59) 
    at WordFind00.main(WordFind00.java:45) 

這裏是我的代碼 - 有什麼可以去錯了嗎? 它的一部分被註釋掉,用於測試每個方向。

  public static String findWord(char[][]board, String word) { 

      for (int row = 0; row < board.length; row++) { 
       for (int col = 0; col < board[row].length; col++) { 

        if (board[row][col] == word.charAt(0)) { 

         // search to the right 
         for (int letters = 0; letters < word.length(); letters++) { 
          if (word.charAt(letters) == board[row][col+letters]) { 
           System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters})); 
          } 
         } // end search to the right 

         /*// search to the left 
         for (int letters = 0; letters < word.length(); letters++) { 
          if (word.charAt(letters) == board[row][col-letters]) { 
           System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col-letters})); 
          } 
         } // end search to the left 

         // search down 
         for (int letters = 0; letters < word.length(); letters++) { 
          if (word.charAt(letters) == board[row+letters][col]) { 
           System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row+letters,col})); 
          } 
         } // end search down 

         // search up 
         for (int letters = 0; letters < word.length(); letters++) { 
          if (word.charAt(letters) == board[row-letters][col]) { 
           System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row-letters,col})); 
          } 
         } // end search down */ 

        } 
       } 
      } 
      return null; 
     } 

如果有人想測試一下: WordFind00.java:http://pastebin.com/DeNEQAsp input.dat:http://pastebin.com/WyYF3wPA

+0

這功課嗎? – Peter 2014-10-10 03:35:11

+0

考慮提供一個[runnable示例](https://stackoverflow.com/help/mcve),它演示了您的問題。這將導致更少的困惑和更好的迴應 – MadProgrammer 2014-10-10 03:36:32

+1

@Peter,是的。我一直困在這個問題一段時間,我無法弄清楚。任何幫助,將不勝感激。 – jdc987 2014-10-10 03:37:16

回答

1

你是不是檢查您的陣列indicies的範圍,例如...

if (word.charAt(letters) == board[row][col-letters]) { 

如果col-letters小於0,則會拋出ArrayIndexOutOfBoundsException,這適用於您的每項支票...

你可以做這樣的事情......

if (col - word.length() >= 0) { 
    for (int letters = 0; letters < word.length(); letters++) { 
     if (word.charAt(letters) == board[row][col-letters]) { 
      System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters})); 
     } 
    } // end search to the right 
} 

這將確保for-loop只會被運行,如果col - word.length不會擴展超過數組的開始。如果是這樣,那麼就沒有真正的理由嘗試甚至檢查剩餘的單元。

您將需要這適用於所有你條件

更新

你要提取輸出的原因是因爲你找到一個匹配字符的那一刻,你打印出來,無論你有充分的匹配或不...這裏有一個小騙子,將爲水平的檢查工作...

String test = new String(board[row], col, word.length()); 
if (test.equals(word)) { 

    System.out.println("Found [" + word + "] @ " + row + "x" + col); 

} 

另外,如果你必須循環,你可以做類似...

if (col + word.length() <= board[row].length) { 

    int letters = 0; 
    while (letters < word.length() && word.charAt(letters) == board[row][col + letters]) { 
     letters++; 
    } 

    if (letters == word.length()) { 
     System.out.println("Found [" + word + "] @ " + row + "x" + col); 
    } 
} 

這基本上檢查,看看是否匹配的字符數等於原詞與否的長度...

+0

好的,我添加了這個 - 謝謝你。但是,現在我正在獲得不同的輸出。當我搜索「ALGO」時,我得到了A,A,L,A,O,A,L,G,O,A,L,G,O.爲什麼我只是得到A,L,G,O? – jdc987 2014-10-10 03:53:34

+0

可能因爲你沒有退出條件從你循環一旦你滿意,你已經找到了你正在尋找的單詞... – MadProgrammer 2014-10-10 03:54:45

+0

是的,這是真的,但即使在我收到字母之前,我不應該。 – jdc987 2014-10-10 03:56:22

1

首先,你的錯誤是因爲你不檢查你的索引。所有你需要做的解決這個問題是檢查單詞不會超過當前方向的數組長度。

其次,您沒有退出聲明。所以你會一直循環,直到你遍歷整個板子。你可以嘗試以下方法:

//If we can't fit the word in, don't bother trying 
if(col - word.length() >= 0) 
{ 
    boolean foundWord = true; 
    for (int letters = 0; letters < word.length(); letters++) 
    { 
     //Stop trying as soon as we find a character that doesn't fit 
     //Search to the right 
     if (word.charAt(letters) != board[row][col+letters]) 
     { 
      foundWord = false; 
      break; 
     } 
    } 
    //We can only get here if we've looped through the entire word and found a match for all of it. 
    if(foundWord) 
    { 
     //Yay! I'm not sure about your return value though. 
     return "foundString!"; 
    } 
} 

最後,未成年人挑剔,雖然它沒有爲一個小例子沒關係,它的清潔劑來看待和理解這種方式......你可能不希望爲每個方向做循環。您可以在該循環內的每個方向上進行搜索。

相關問題