ようやく完成した Java Trie を作成していますが、Trie 内のすべての値を返す getWords() 関数を追加しています。
その機能に問題があります。簡単な背景情報: すべての文字には、実際にはすべての親文字を含む単語全体である「インデックス」があります。"soup" という単語を入力すると、文字 p の値は isWord = true および index = "soup" になります。
また、表示される 'children' 変数は HashMap であり、この関数は TrieNode クラス内にあることに注意してください。
私に問題を与えるコード:
private List<String> wordList = new ArrayList<String>();
public List<String> getWords(){
/*Iterate through trie for every value in the hash map.
Find all words with isWord= true and add that index to wordList
*/
String word;
for(Character key : children.keySet()){
children.get(key).getWords();
if(children.get(key).isWord == true){
word = (children.get(key).index);
wordList.add(word);
System.out.println(wordList); //prints list here for test
}
}
System.out.println(wordList); // prints again for test (second print)
return wordList;
}
最初の print ステートメントは、isWord が true のときにハッシュ マップが現在存在していた現在の単語である 1 つの単語を出力します。次に印刷するとき (再帰的に実行する場合) は、その 1 つの単語だけを再度印刷します。
IE: "soup" と "hello" という 2 つの単語をトライに追加すると、hello とsoup がそれぞれの行に出力されますが、2 回目にリスト全体を出力すると、wordList は明らかに最初の単語を失います。
wordList から単語が失われている理由がわかりません。最初は「こんにちは」、2 回目は「こんにちはスープ」と出力する必要があります。
関数が完了すると、完全に空で何も含まれていない wordList が返されます。
編集:
混乱のため、ここに少しビジュアルを追加します。(トライのすべてのコードを含めるのは不要すぎるでしょう)。
単語「こんにちは」「こんにちは」「スープ」をトライに追加する
次の構造を与えます
トライ全体に 2 つのキーと値のペアが含まれるようになりました。HとS.
H は、内部に個別の Trie 全体を含むキーです。H の中には、ノード I と E があります (hello と hi の場合)。
S ノードには O があり、O には U などがあります。
ハッシュマップキーを反復処理してSとHのみを取得できるため、再帰が必要です。これらのノードのキーも必要なので、これを再帰的に行います。
これらの接頭辞の最後には、最終的に単語が続きます。単語に到達したら、それを wordList に追加します。
最後に、最終的にwordListを返したい