Итераторы Java - Попытка заставить работать каждый цикл - PullRequest
2 голосов
/ 28 марта 2010

Итак, у меня есть класс Tree<E>, где E - это тип данных, хранящийся и организованный деревом. Я бы хотел перебрать дерево, как это, или так:

1.  Tree<String> tree=new Tree<String>();
2.  ...add some nodes...
3.  for (String s : tree)
4.      System.out.println(s);

Это дает мне ошибку в строке 3.

Incompatible types
    required: java.lang.String
    found:    java.lang.Object    

Следующее, однако, работает нормально и, как и ожидалось, выполняя правильный обход дерева в порядке и распечатывая каждый узел как следует:

for (TreeIterator<String> i = tree.iterator(); i.hasNext(); )
    System.out.println(i.next());


Мой класс Tree выглядит так:

public class Tree<E> implements java.lang.Iterable{
    ...
    public TreeIterator<E> iterator(){
        return new TreeIterator<E>(root);//return an iterator for the root node
    }
    ....
}


И мой класс TreeIterator выглядит так:

public class TreeIterator<E> implements java.util.Iterator<E>{
    public E next(){
        ...
    }
    ...
}

Но я хочу, чтобы петля for (String s : tree) работала правильно - есть идеи? Смысл этого состоял в том, чтобы настроить чистый цикл foreach для использования в моей программе, а не использовать этот уродливый цикл for.

Есть идеи, что я делаю не так?


Редактировать

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

Изменение

public class Tree<E> implements java.lang.Iterable{
    ....
}

до

public class Tree<E> implements java.lang.Iterable<E>{
    ....
}

... Спасибо, ребята!

Ответы [ 3 ]

5 голосов
/ 28 марта 2010

Цикл foreach должен работать нормально, если ваш класс Tree<E> также реализует интерфейс Iterable<E>. Вы должны убедиться, что ваш итератор также возвращает универсальный тип E.

4 голосов
/ 28 марта 2010

Ваш Tree должен реализовать Iterable<E>, если вы хотите, чтобы он работал с каждым циклом в общем виде (и, следовательно, ваш iterator() метод должен возвращать Iterator<E>)

0 голосов
/ 28 марта 2010

Цикл for в вставленном вами коде:

3. для (Строка s: дерево)

неправильно вводит элементы дерева dataStructure в коллекцию (или массив) строк.

Я подозреваю, что это должно выглядеть примерно так:

for (String s : tree.getNodes()){...}

Где getNodes возвращает коллекцию строк.

Не могу сказать наверняка, пока вы не вставите больше кода.

...