Добавление значений в ArrayList с помощью рекурсии стирает список для каждого нового добавленного значения?

Я делаю java Trie, который наконец-то завершил, но добавляю функцию getWords(), которая вернет все значения внутри Trie.

У меня проблема с этой функцией. Краткая справочная информация: у каждого символа есть «индекс», который на самом деле представляет собой все слово, включая все родительские символы. Когда вы вводите слово «суп», буква p имеет значение isWord = true и index = «суп».

Также переменная «дети», которую вы видите, является 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 было истинным. В следующий раз, когда он печатает (при рекурсивном запуске), он снова печатает только это одно слово.

IE: Если вы добавите два слова в тройку «суп» и «привет», будет напечатано: привет и суп в отдельных строках, но wordList, по-видимому, теряет первое слово при печати всего списка во второй раз.

Я не уверен, почему слова теряются из списка слов. Он должен напечатать: «привет» в первый раз и «привет, суп» во второй раз, не так ли?

Как только функция выполнена, она возвращает wordList, который совершенно пуст и в нем ничего нет.

РЕДАКТИРОВАТЬ:

Из-за путаницы я добавляю здесь немного визуального. (включая весь код для попытки было бы слишком ненужным).

добавление слов «привет» «привет» «суп» в Trie

дает ему следующую структуру

Все дерево теперь имеет две пары ключ-значение. Руки.

H — это ключ, который содержит внутри себя целое отдельное Trie. внутри H находятся узлы I и E (для привет и привет)

В узле S есть O, а в O есть U и т. д. и т. д.

Рекурсия необходима, потому что вы можете перебирать ключи хэш-карт и получать только S и H. Мне также нужны ключи ЭТИХ узлов, поэтому я делаю это рекурсивно.

В конце этих префиксов в конечном итоге будут слова. Как только я достигну слова, я хочу добавить его в список слов.

В конце концов я хочу в конечном итоге вернуть wordList


person leigero    schedule 17.06.2013    source источник
comment
Что это за вызов .getWords() в начале каждого цикла?   -  person fge    schedule 17.06.2013
comment
это обратный вызов той же функции. Это функция getWords().   -  person leigero    schedule 17.06.2013
comment
Да, но я имею в виду, для чего он используется? Вы игнорируете его возвращаемое значение   -  person fge    schedule 17.06.2013
comment
Ну, у меня есть класс Trie и класс TrieNode. (это все часть TrieNode). Я намеревался вызвать функцию getWords из класса Trie и заставить ее вернуть список слов. Но мне нужно, чтобы функция getWords была рекурсивной, чтобы получить все слова, поэтому у меня проблема с игнорированием возвращаемого значения до конца. Я не уверен, как обойти это.   -  person leigero    schedule 17.06.2013
comment
Что вы имеете в виду под Trie в первом предложении?   -  person AJMansfield    schedule 17.06.2013
comment
Я не понимаю, зачем вам рекурсия, если вы работаете в цикле. По сути, вы просматриваете каждый ключ (keySet()) на своей карте и возвращаете индекс символов, который isWord является истинным... правильно?   -  person ola    schedule 17.06.2013
comment
@AJMansfield Trie - это дерево префиксов, вы храните слова в дереве, где каждое слово имеет префикс, ведущий к этому слову. привет имеет префикс ч привет имеет префикс ад и т. д.   -  person leigero    schedule 17.06.2013
comment
Совет по стилю: избегайте этого: children.get(key).isWord == true. Просто используйте: children.get(key).isWord или, если isWord является логическим объектом, используйте это: children.get(key).isWord == Boolean.TRUE   -  person Andrew Eisenberg    schedule 17.06.2013
comment
Хорошо, я вообще не знаю, что такое trie, но разве вы не можете сделать это .getWords() вычисление, когда вместо этого создается объект?   -  person fge    schedule 17.06.2013


Ответы (1)


На самом деле это не рекурсия, поскольку вы вызываете getWords для другого экземпляра объекта вместо this. В комментариях fge правильно указывает, что результаты игнорируются. По сути, вы получите отдельные списки на каждом уровне графа объектов, где объект имеет только слова своего непосредственного потомка. Один из способов исправить это — создать List на верхнем уровне и передать его в метод getWords, чтобы каждый элемент добавлял свои слова к этому List.

person laz    schedule 17.06.2013
comment
Хорошо, я бы проголосовал за тебя тысячу раз, если бы мог. Это было легко исправить, большое спасибо!! - person leigero; 17.06.2013
comment
Первый вызов будет проходить во вновь созданный List, а последующие вызовы будут иметь доступ к тому же списку. List создается только первым вызывающим абонентом. - person laz; 17.06.2013