你实现什么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