あなたが実装したものは"trie"と呼ばれ ます。既存の実装を見たいと思うかもしれません。
子ノードを格納するために使用したものはハッシュ テーブルと呼ばれ、非常に具体的な理由がない限り、標準の実装を使用して自分で実装することは避けた方がよいでしょう。実装にはいくつかの制限があります (文字範囲など)。
あなたのコードには method にバグがあると思いますhas
:
...
else if (letter[val].flag==true || word.length()==1) {
return true;
}
で始まる文字列がある場合にそのメソッドが true を返すことを意図している場合、word
チェックすべきではありませんflag
。完全一致のみが存在する場合に 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());
}
}
}
}