可迭代的接口实现

时间:2013-07-11 04:26:39

标签: java interface iterator stack

有人可以告诉我Stack的实现是否正确吗?

   class LevelIter<Node> implements Iterable<Node> {
        Stack<Node> s = null;
        public LevelIter(Stack<Node> s) {
            this.s = s;
        }
        public Iterator<Node> iterator(){
            Iterator<Node> it = new Iterator<Node>() {
                private int index = 0;

                @Override
                public boolean hasNext(){
                        return (index < s.size() && !s.isEmpty());
                }

                @Override
                public Integer next(){
                    return (Integer) (s.pop()).data;
                }

                @Override
                public void remove(){
                    s.remove();
                }
            };
            return it;
        }
    }

其中Node是二叉树中的节点 -

  class Node{
    int data;
    Node left;
    Node right;
    public Node(int data){
        this.data = data;
        this.left = null;
        this.right = null;
    }
}

我打电话给主要的 -

    LevelIter<Node> l = new LevelIter<Node>(s);
    for(int n:l){
        System.out.println(n);
    }

1 个答案:

答案 0 :(得分:0)

迭代器可能不应该修改共享数据结构。您的构造函数应该复制传递的堆栈,以便它不会从中弹出元素。

通过引用传递并通过值传递是棘手的主题。您实际上是在代码中复制引用,因此LevelIter的Stack对象将与传入的任何堆栈相同。这意味着当您使用LevelIter进行迭代时,它将清空LevelIter所构建的任何堆栈。这可能是不可取的,这也是我建议如下的原因:

class LevelIter<Node> implements Iterable<Node> {
    Stack<Node> s = null;
    public LevelIter(Stack<Node> s) {
        this.s = (Stack)s.clone();
    }
    //rest is the same.
}

您的其余代码对我来说很好。确保代码正常工作的最佳方法是测试它。创建一个只测试这个迭代器的类。确保其功能符合您的预期。