java - 通过递归向 ArrayList 添加值是否会删除每个添加的新值的列表?

标签 java recursion arraylist trie

我正在制作一个 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/

相关文章:

java - 我如何找出 Tomcat 使用这么多内存的原因并停止它?

android - phone gap 安卓环境设置

c++ - valgrind 能否报告丢失 block 的内存地址(用于调试递归函数调用)?

java - 在列表中查找对象的索引

java - 在这种情况下如何使用迭代器?

java - 动画关键帧导致的零除异常(LIBGDX)

Java Android 模拟器 : Crash when using Maps v2 (Caused by android. view.InflateException:二进制 XML 文件行 #11:错误膨胀类 fragment

java - 从常规方法创建递归方法

java - Java中的isHappy函数

java - 如何将自定义对象的 ArrayList 传递给新 Activity ?