【发布时间】:2016-08-10 21:18:15
【问题描述】:
如何在不同对象的层次结构上实现单循环迭代?
(我使用了 for 循环,但它们代表了网格的不同区域——我几乎无法遵循所有用于定位的值。使用单个循环将大大简化事情。)
这个对象层次结构就是我所拥有的......
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实例中的子节点是树,包含种子的树也是如此。
...这就是我想要做的:
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(); 时出错,因为 p 的类型是 Planet。
编辑:这需要是“Depth-Last”(...或 FIFO?)。循环是为了简化 UI 的生成,所以顺序很重要。
【问题讨论】:
-
那么您想要一个遍历特定节点的整个子层次结构的迭代器吗?你想要深度优先还是呼吸优先?
-
谢谢安德烈亚斯。我不认为它是“第一个”或“最后一个”,而是“遇到的”。我认为 Ramsay 已经使用递归发布了一个不错的答案。我不能说我爱上了这个结果,但它应该可以工作。
标签: java javafx collections iterator hierarchy