Как реализовать однопроцессорную итерацию по иерархии разных объектов?Одиночная итерация по иерархии в Java 8
(я использовал для петель, но они представляют собой различные области сетки - я едва могу следовать все значения, которые используются для позиционирования Использование одного цикла будет существенно упростить.).
Этот иерархия объектов это то, что у меня есть ....
class Hierarchical < PT extends Hierarchical<?,?,?>,T,CT extends Hierarchical< ?, ?, ? >>{
ObservableList<Hierarchical> children; //Zero or more objects..
}
class Seed extends Hierarchical { /* never has children-objects */ }
class Tree extends Hierarchical { ... }
class Planet extends Hierarchical { ... }
Редактировать: Дети в случае планеты являются деревья, то же самое для деревьев, содержащих семена.
... и это то, что я хочу сделать:
Planet p = new Planet(); //trees/seeds are instantiated internally.
Iterator<?> itr = p.getChildren().iterator();
while (itr.hasNext()) {
Object obj = itr.next();
if (obj instanceof Planet){ /* cast to Planet & do stuff */ }
if (obj instanceof Tree ){ /* cast to Tree & do stuff */ }
if (obj instanceof Seed ){ /* cast to Seed & do stuff */ }
}
Очевидно, что ответ лежит в Iterator<?> itr = p.getChildren().iterator();
, но как это можно реализовать? Казалось бы, каждый уровень иерархии должен будет поддерживать положение своих детей в том случае, если его дети начнут цитировать своих детей. Это было слишком долго, я больше не знаком с шаблонами дизайна & java. :(
Замечу, что у меня была ошибка при попытке использовать Iterator<Hierarchical> itr = p.getChildren().iterator();
, потому что р имеет тип планеты
Редактировать:. Это должно быть «Глубина-Last» (... или FIFO ?) Цикл - это упрощение генерации пользовательского интерфейса, поэтому порядок важен.
https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/TreeTraverser.html –
Итак, вы хотите итератор, который пересекает весь суб-иерархии конкретного узла? Вы хотите сначала сначала глубину, или дыхание? – Andreas
Спасибо, Андреас. Я не думаю, что это «первый» или «последний», но вместо этого «встречается». Я думаю, что Рамсей уже опубликовал достойный ответ, используя рекурсию.Я не могу сказать, что я влюблен в результат, но он должен работать. –