我正在创建一个java Trie,我最终完成了,但是我添加了getWords()函数,它将返回Trie中的所有值。
我遇到了这个功能的问题。快速背景信息:每个字符都有一个'索引',实际上是整个单词,包括所有父字符。当您输入单词“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为真时,哈希映射当前所在的单词。下次打印时(递归运行时)它再次打印只有一个单词。
IE:如果你在trie“汤”和“你好”中添加两个单词,它会打印:hello和soup在他们自己的行上,但是wordList在第二次打印整个列表时显然会丢失第一个单词。
我不确定为什么单词会从wordList中丢失。它应该打印:第一次“hello”和第二次“hello soup”不应该打印?
一旦函数完成,它将返回wordList,它完全为空,并且没有任何内容。
编辑:
由于混乱,我在这里添加了一些视觉效果。 (包括trie的所有代码都太不必要了。)
将“hello”“hi”“soup”添加到Trie
给它以下结构
整个trie现在有两个键值对。 H和S.
H是包含整个单独Trie的键。在H里面是节点I和E(对于你好和你好)
S节点中有O,O有U等等。
递归是必要的,因为你可以遍历哈希映射键并且只获得S和H.我还需要THOSE节点的键,所以我递归地执行此操作。
这些前缀的末尾最终将是单词。一旦我到达单词,我想将它添加到wordList。
最后我想最终返回wordList
答案 0 :(得分:1)
这不是真正的递归,因为您在对象的另一个实例而不是getWords
上调用this
。在评论中,fge
指出结果被忽略是正确的。在对象图中的每个级别,您最终会得到单独的列表,其中对象只有它的直接后代的单词。解决此问题的一种方法是在顶层创建List
并将其传递给方法getWords
,并让每个元素将其字词添加到List
。