Я делаю 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
.getWords()
в начале каждого цикла? - person fge   schedule 17.06.2013children.get(key).isWord == true
. Просто используйте:children.get(key).isWord
или, еслиisWord
является логическим объектом, используйте это:children.get(key).isWord == Boolean.TRUE
- person Andrew Eisenberg   schedule 17.06.2013.getWords()
вычисление, когда вместо этого создается объект? - person fge   schedule 17.06.2013