你實現什麼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());
}
}
}
}
感謝您的回覆!我會放棄它。至於我的方法中的錯誤,爲什麼它必須返回真正的完全匹配?如果輸入「tes」,它是否也會返回true?是的,它不是確切的單詞,但是當用戶輸入「tes」時,它應該顯示以該單詞開始的所有內容 – Teddy13
@ Teddy13,我不知道該方法打算做什麼,但是如果它應該對' tes',那麼它不應該檢查'flag'是否爲真(因爲'flag'沒有'''''Node'實例。看看我的'Node._match' impl,它做了什麼你想要(只是返回一個節點,而不是布爾值,以備後用)。 – khachik