2013-04-16 65 views
4

我是新來的java,我想創建一個非常簡單的「單詞完成」程序。我將在字典文件中讀取並遞歸地將這些字添加到一個節點數組(26號)中。我相信我已經成功地做到了這一點,但我不知道如何通過並打印比賽。爲了測試,我現在簡單地通過調用函數插入2個單詞。一旦一切正常,我將添加方法來讀取文件並從文字中刪除垃圾。打印樹組件

例如:如果單詞「test」和「tester」在樹中,並且用戶輸入「tes」,則應該顯示「test」和「tester」。

如果有人可以請告訴我如何通過打印匹配(如果有的話),我會非常感激。完整的代碼如下。

這裏謝謝

回答

3

你實現什麼is called"trie"。你可能想看看現有的實現。

你用來存儲子節點的稱爲哈希表,你可能想要使用標準實現並且避免自己實現它,除非你有非常非常特殊的理由去做。你的實現有一些限制(例如字符範圍)。


我想,你的代碼中有方法has了一個錯誤:

... 
else if (letter[val].flag==true || word.length()==1) { 
    return true; 
} 

如果該方法的目的是如果有與word開始那麼它不應該檢查flag字符串返回true。如果僅在完全匹配時才返回true,則不應檢查word.length()

最後,解決您的問題:不是最優的,但最簡單的解決方案是創建一個方法,該方法接受一個字符串並返回與該字符串匹配的節點以及組成該節點中所有單詞的方法。像這樣(未測試):

class Tree { 

    ... 
    public List<String> matches(CharSequence prefix) { 
     List<String> result = new ArrayList<>(); 
     if(r != null) { 
      Node n = r._match(prefix, 0); 
      if(n != null) { 
       StringBuilder p = new StringBuilder(); 
       p.append(prefix); 
       n._addWords(p, result); 
      } 
     } 
     return result; 
    } 
} 

class Node { 

    ... 
    protected Node _match(CharSequence prefix, int index) { 
     assert index <= prefix.length(); 
     if(index == prefix.length()) { 
      return this; 
     } 
     int val = prefix.charAt(index) - 'a'; 
     assert val >= 0 && val < letter.length; 
     if (letter[val] != null) { 
      return letter[val].match(prefix, index+1); 
     } 
     return null; 
    } 

    protected void _addWords(StringBuilder prefix, List<String> result) { 
     if(this.flag) { 
      result.add(prefix.toString()); 
     }  
     for(int i = 0; i<letter.length; i++) { 
      if(letter[i] != null) { 
       prefix.append((char)(i + 'a')); 
       letter[i]._addWords(prefix, result); 
       prefix.delete(prefix.length() - 1, prefix.length()); 
      } 
     } 
    } 
} 
+0

感謝您的回覆!我會放棄它。至於我的方法中的錯誤,爲什麼它必須返回真正的完全匹配?如果輸入「tes」,它是否也會返回true?是的,它不是確切的單詞,但是當用戶輸入「tes」時,它應該顯示以該單詞開始的所有內容 – Teddy13

+0

@ Teddy13,我不知道該方法打算做什麼,但是如果它應該對' tes',那麼它不應該檢查'flag'是否爲真(因爲'flag'沒有'''''Node'實例。看看我的'Node._match' impl,它做了什麼你想要(只是返回一個節點,而不是布爾值,以備後用)。 – khachik

-1

也許跳槽,但你爲什麼不試試這裏的正則表達式?據我理解你想匹配單詞的單詞列表:

List<String> getMatches(List<String> list, String regex) { 

    Pattern p = Pattern.compile(regex); 
    ArrayList<String> matches = new ArrayList<String>(); 

    for (String s:list) { 
    if (p.matcher(s).matches()) { 
     matches.add(s); 
    } 
    } 

    return matches 
} 
+1

我想學習如何做到這一點與數組和樹結構,因爲我只是學習java。謝謝。你知道我能用這兩樣東西做到嗎? – Teddy13