如何在Java中为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

我想在数据结构上有一个迭代器。 现在我不知道数据结构是什么,可能是DAG(有向无环图),但也可能是链表。 所以我想把它包装成一个迭代器,现在不考虑特定的数据结构

我知道如何和一个类似递归的访问者一起访问DAG, 但是我无法找到一个简单而干净的结构来实现迭代器方法
next()
hasNext()

在迭代器中,我创建了一个当前节点实例,并在所有子节点上使用for循环进行迭代,然后返回父节点。需要“已访问”标志。 因此,my
DagElement
具有以下更多属性:

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实现迭代器编写代码,并使用我的代码,它只依赖于元素和迭代器接口。我是否走错了方向?正如我所说,迭代器的实现完全取决于数据结构的实现。如果你能做一个通用的迭代器,可以在任何数据结构上进行迭代,那么肯定有人已经做了。