【问题标题】:Iterable interface implementation可迭代的接口实现
【发布时间】:2013-07-11 04:26:39
【问题描述】:

谁能告诉我我的 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);
    }

【问题讨论】:

    标签: java interface iterator stack


    【解决方案1】:

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

    按引用传递和按值传递是难以掌握的主题。您实际上是在代码中复制引用,因此 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.
    }
    

    您的其余代码对我来说看起来不错。确保您的代码有效的最佳方法是对其进行测试。创建一个仅测试此迭代器的类。确保其按您预期的方式运行。

    【讨论】:

    • 是的,但是参考是一样的。 java中的对象是通过引用而不是值传递的。
    • 好的..我还有一个问题..我可以把这个 LevelIter 类放在另一个类中吗?因为我试过了,但我收到了这个错误——“ReverseLevelOrder.java:20: error: 不是抽象的,不会覆盖 Iterator Iterator 中的抽象方法 next() it = new Iterator () { 其中 Node 是一个类型变量:Node 扩展在类 ReverseLevelOrder.LevelIter 中声明的 Object"
    • 嵌套类是允许的,虽然我个人不喜欢它。您的错误正在发生,因为您已经为 next() 方法声明了 Integer 的返回类型。返回类型必须是 Node,而不是整数,因为您正在使用通用 实现 Iterator。因此,要么返回节点,要么使用 Integer 泛型,例如 Iterator it = new Iterator()
    • 好的.. 谢谢修复了一些错误.. :) .. 最后一个问题.. 我对“next()”和“remove()”的实现感到困惑做同样的操作,即 s.pop()?
    • 删除是可选操作。如果您确实打算在构造函数中复制堆栈,我不会在这里实现它。如果您不在构造函数中复制堆栈,请实现 remove ,是的,让它弹出。
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2013-11-02
    • 2010-11-25
    • 2020-07-31
    • 2022-01-10
    • 2014-10-12
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多