誠實地說,我花了幾天的時間看着這個並試圖弄明白,但是都很短暫。目標是查看trie節點是否有下一個,如果是的話。java - 覆蓋迭代器?
當它是由被稱爲:
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;
}
請不要改變目前執行的線索:)
的
什麼「不工作」,以及你是如何獲得你的迭代器的實例? – chrylis
首先,定義如何遍歷樹中的所有元素來完成基本任務,例如打印它們。然後,在'TrieIterator'中實現這些方法來實現這種行爲。 –
對不起,你的問題到底是什麼?你是否要求某人爲你寫'TrieIterator'? – ruakh