我正在制作一个 java Trie,我终于完成了,但我添加了 getWords() 函数,它将返回 Trie 内的所有值。
我在使用该功能时遇到问题。快速背景信息:每个字符都有一个“索引”,它实际上是整个单词,包括所有父字符。当您输入单词“soup”时,字母 p 的值为 isWord = true 且索引 =“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;
}
第一个打印语句打印出一个单词,即 isWord 为 true 时 HashMap 当前所在的当前单词。下次打印时(递归运行时),它再次仅打印该单词。
IE:如果你向 trie 添加两个单词“soup”和“hello”,它会在各自的行上打印:hello 和 soup,但是在第二次打印整个列表时,wordList 显然会丢失第一个单词。
我不确定为什么单词会从单词列表中丢失。它应该打印:第一次“hello”,第二次“hello soup”,不是吗?
函数完成后,它会返回完全空的 wordList,其中没有任何内容。
编辑:
由于困惑,我在这里添加了一些视觉效果。 (包括 trie 的所有代码是不必要的)。
将单词“hello”“hi”“soup”添加到特里树中
给出以下结构
整个特里树现在有两个键值对。 H 和 S。
H 是键,其中包含整个独立的 Trie 树。 H 内部是节点 I 和 E(代表 hello 和 hi)
S节点中有一个O,O中有一个U等等。
递归是必要的,因为您可能会迭代 HashMap 键并且只得到 S 和 H。我也需要这些节点的键,所以我递归地执行此操作。
这些前缀的末尾最终将是单词。一旦我到达单词,我想将其添加到单词列表中。
最后我想最终返回wordList
最佳答案
这并不是真正的递归,因为您是在对象的不同实例上调用 getWords
,而不是 this
。在注释中,fge
正确地指出结果被忽略。本质上,您最终会在对象图中的每个级别得到单独的列表,其中对象仅具有其直接后代的单词。纠正此问题的一种方法是在顶层创建 List
并将其传递到 getWords
方法中,并让每个元素将其单词添加到该 List
.
关于java - 通过递归向 ArrayList 添加值是否会删除每个添加的新值的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153725/