2014-11-20 2 views
0

Я пишу программу, которая берет двоичное дерево и выполняет итерацию через него в порядке. Для этого мой класс итератора обходит дерево и добавляет элементы в список, а затем список повторяется. В отладке моего кода я обнаружил, что список содержит 4 разных элемента так же, как и должен, но в main, когда список печатается, я получаю tinsel (первый элемент списка) снова и снова в бесконечном цикле. Поэтому итератор просто не выполняет итерации; он застревает в первом элементе.Java List Iterator, похоже, неправильно итерации

Итератор класс:

import java.util.*; 

@SuppressWarnings("rawtypes") 
public class TreeIterator implements Iterator{ 

    BinaryTree BT; 

    TreeIterator(BinaryTree BT){ 
     this.BT=BT; 
     inOrder(BT.root); 
    } 

    private List<String> decorationList = new ArrayList<String>(); 

    private void inOrder(Node root){ 
     if(root==null) return; 
     inOrder(root.left); 
     String temp = root.decoration; 
     decorationList.add(temp); 
     inOrder(root.right); 
    } 

    public boolean hasNext() { 
     return decorationList.iterator().hasNext(); 
    } 

    public Object next() { 
     return decorationList.iterator().next(); 
    } 

    public void remove() { 
     // this method is not implemented   
    } 

} 

Основная функция:

public class Main { 
    public static void main(String[] args) { 

     // build a test tree 
     // 
     //  star 
     // / \ 
     // tinsel red balls 
     //  \ 
     //  lights 
     BinaryTree BT = new BinaryTree(); 
     BT.root = new Node(); 
     BT.root.decoration = "star"; 
     BT.root.left = new Node(); 
     BT.root.left.decoration = "tinsel"; 
     BT.root.left.right = new Node(); 
     BT.root.left.right.decoration = "lights"; 
     BT.root.right = new Node(); 
     BT.root.right.decoration = "red balls"; 


     TreeIterator TI = BT.createIterator(); 
     while(TI.hasNext()){ 
      System.out.println(TI.next()); 
     } 
    } 
} 

Позвольте мне знать, если я должен добавить реализацию Binary Tree, а также.

+0

Это '@SuppressWarnings (" rawtypes ")' is evil. Кроме того, почему вы получаете «итератор» снова при каждом вызове? –

ответ

0
public Object next() { 
    //     vvvvvvvvvvv 
    return decorationList.iterator().next(); 
} 

Каждый раз, когда вы вызываете эти методы, вы создаете новый Iterator. Вот почему вы видите поведение, какое вы есть. Каждый раз, когда hasNext или next, называется, вы делаете новый итератор, который начинается с 0.

Вместо этого, если вы пишете итератор, который просто делегирует к другому, вы должны создать его один раз в конструкторе:

class IteratorDelegator<T> implements Iterator<T> { 
    private final Iterator<? extends T> delegate; 

    IteratorDelegator(Iterable<? extends T> iterable) { 
     this.delegate = iterable.iterator(); 
    } 

    @Override 
    public T next() { 
     return delegate.next(); 
    } 

    ... 
} 

Также: в целом мы не используем raw types. Если ваш BinaryTree является неэквивалентным, вы должны реализовать Iterator<Object> вместо необработанного типа. С decorationList есть List<String> похоже, что вы должны использовать Iterator<String>.