通过递归向ArrayList添加值是为每个添加的新值删除列表吗?

时间:2013-06-17 17:53:56

标签: java recursion arraylist trie

我正在创建一个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

1 个答案:

答案 0 :(得分:1)

这不是真正的递归,因为您在对象的另一个实例而不是getWords上调用this。在评论中,fge指出结果被忽略是正确的。在对象图中的每个级别,您最终会得到单独的列表,其中对象只有它的直接后代的单词。解决此问题的一种方法是在顶层创建List并将其传递给方法getWords,并让每个元素将其字词添加到List