如何在Java中为DAG结构创建迭代器包装器?
我想在数据结构上有一个迭代器。 现在我不知道数据结构是什么,可能是DAG(有向无环图),但也可能是链表。 所以我想把它包装成一个迭代器,现在不考虑特定的数据结构 我知道如何和一个类似递归的访问者一起访问DAG, 但是我无法找到一个简单而干净的结构来实现迭代器方法如何在Java中为DAG结构创建迭代器包装器?,java,tree,iterator,visitor,directed-acyclic-graphs,Java,Tree,Iterator,Visitor,Directed Acyclic Graphs,我想在数据结构上有一个迭代器。 现在我不知道数据结构是什么,可能是DAG(有向无环图),但也可能是链表。 所以我想把它包装成一个迭代器,现在不考虑特定的数据结构 我知道如何和一个类似递归的访问者一起访问DAG, 但是我无法找到一个简单而干净的结构来实现迭代器方法next()和hasNext() 在迭代器中,我创建了一个当前节点实例,并在所有子节点上使用for循环进行迭代,然后返回父节点。需要“已访问”标志。 因此,myDagElement具有以下更多属性: DagElement parent b
next()
和hasNext()
在迭代器中,我创建了一个当前节点实例,并在所有子节点上使用for循环进行迭代,然后返回父节点。需要“已访问”标志。
因此,myDagElement
具有以下更多属性:
DagElement parent
boolean alreadyVisited
我认为这不是一个干净的解决方案
有什么建议吗?将递归启发式转换为迭代启发式的快速而肮脏的方法是使用(后进先出)堆栈或(LILO)队列来保存“未采取的道路”——已找到但尚未采取的路径。在这种情况下,迭代器将具有堆栈或队列实例变量。比如:
class DagIterator<T>
extends Iterator<T> {
private Stack<DagNode<T>> nodes;
private DagIterator(Dag<T> dag) {
nodes.push(dag.getRootNode());
}
public boolean hasNext() {
return ! nodes.isEmpty();
}
public T next() {
final DagNode node = nodes.pop();
for (final DagNode child : node.getChildren()) {
nodes.push(child);
}
return node.getValue();
}
}
类迭代器
扩展迭代器{
私有堆栈节点;
专用Dag迭代器(Dag Dag){
nodes.push(dag.getRootNode());
}
公共布尔hasNext(){
return!nodes.isEmpty();
}
公共交通工具{
final DagNode=nodes.pop();
对于(最后一个节点子节点:node.getChildren()){
节点推送(子节点);
}
返回node.getValue();
}
}
您可以根据数据结构(LIFO或LILO)、孩子排队的顺序以及他们排队的时间来调整访问顺序。一些访问命令可能要求立即(在构造函数中)以正确的顺序将整个节点集排队,这一点我并不感到奇怪 迭代器的实现自然完全取决于数据结构,也取决于您希望迭代的顺序。确定这两点并更新问题。无论如何,
alreadyVisited
不应该是数据结构的成员,而是在迭代器中保留一组对已访问节点的引用。您好,谢谢您的评论,alreadyVisited在一个集合中非常好\n。到目前为止,我知道:我的数据结构是一棵树,我正在“预排序”(访问根,访问子对象)中访问。但事情可能会发生变化,我想留下一个明确的方式来改变它。所以,也许在将来,有人会使用我的代码,使用另一种数据结构(比如,linkedlist)和另一种顺序(比如,从尾部到头部的反转),为他的ListElement实现元素和ListIterator实现迭代器编写代码,并使用我的代码,它只依赖于元素和迭代器接口。我是否走错了方向?正如我所说,迭代器的实现完全取决于数据结构的实现。如果你能做一个通用的迭代器,可以在任何数据结构上进行迭代,那么肯定有人已经做了。