Итератор списка Java, похоже, не выполняет итерацию должным образом

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

Класс итератора:

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());
        }
    }
}

Дайте мне знать, следует ли мне также добавить реализацию двоичного дерева.


person Bobazonski    schedule 20.11.2014    source источник
comment
Это @SuppressWarnings("rawtypes") зло. Кроме того, почему вы снова получаете iterator при каждом звонке?   -  person Elliott Frisch    schedule 20.11.2014


Ответы (1)


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

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

    ...
}

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

person Radiodef    schedule 20.11.2014