【发布时间】:2014-06-08 23:46:57
【问题描述】:
老实说,我花了几天时间研究这个问题并试图弄清楚,但结果很短。目标是查看一个 trie 节点是否有下一个,如果有,它是什么。
它的调用位置:
public Iterator<String> iterator() {
return new TrieIterator();
}
调用它来实现我自己的迭代器。我已经尝试在 hasNext() 中使用数组 + 1 中的位置,还将事物与大小、数量或节点以及子节点进行比较,但结果不足。我最近的尝试类似于(如下),但不起作用。
hasNext() {
return this.children.hasChildren(); /* doesn't work */
}
public class TrieIterator implements Iterator<String> {
public TrieIterator(){
}
public boolean hasNext() {
return false;
}
public String next() {
return null;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
这也是 trieNode 类:
public class TrieNode {
protected char letter = ' ';
protected TrieNode parentNode = null;
protected boolean fullWord = false;
protected TrieNode[] children = new TrieNode[26];
protected int prefixes = 0;
public TrieNode(char letter, TrieNode parentNode){
this.letter = letter;
this.parentNode = parentNode;
}
public boolean hasChildren(){
int index = 0;
while(index < children.length){
if(children[index] != null) {
return true;
}
index++;
}
return false;
}
public TrieNode nodeForLetter(char ch) {
return children[ch - 97];
}
public boolean isEndOfWord() {
return letter == '*';
}
}
增删如下:
public void addWord(String s) {
if (hasWord(s)) return;
int index = 0;
TrieNode current = root;
char[] letters = s.toCharArray();
while(index < s.length()){
TrieNode child = current.children[letters[index] - 97];
if(child == null){
child = new TrieNode(letters[index], current);
child.prefixes++;
numOfNodes++;
}
current = child;
index++;
if(index == s.length()){
current.fullWord = true;
numOfWords++;
}
}
}
public void deleteWord(String s) {
if(s.length() == 0) return;
if(size() == 0) return;
if(!hasWord(s)) return;
TrieNode current = root;
for (char ch : s.toCharArray()) {
TrieNode child = current.children[s.charAt(ch) - 97];
if(child.prefixes == 1){
child = null;
return;
}
else{
child.prefixes--;
current = child;
}
}
current.fullWord = false;
}
public boolean hasWord(String s) {
if(size() == 0) return false;
char[] letters = s.toCharArray();
int l = letters.length;
TrieNode current = root;
int i;
for (i = 0; i < l; i++){
if (current == null) return false;
current = current.children[letters[i] - 97];
}
if (i == l && current == null) return false;
if (current != null && !current.fullWord) return false;
return true;
}
请不要更改 trie 的当前实现 :)
【问题讨论】:
-
什么“不起作用”,您如何获得迭代器的实例?
-
首先,定义如何遍历 trie 的所有元素来完成一项基本任务,例如打印它们。然后,实现
TrieIterator中的方法来实现这个行为。 -
抱歉,您的问题具体是什么?你是在找人给你写
TrieIterator吗? -
@ruakh 不,我想解释一下如何通过 trie,然后我可以自己实现迭代器。
-
@LuiggiMendoza 这就是我目前遇到的问题。
标签: java iterator iteration trie