【问题标题】:How does one change methods of an iterator?如何改变迭代器的方法?
【发布时间】:2011-05-15 23:53:07
【问题描述】:

大家好,我是 Java 新手,我有一个关于集合和迭代器的问题。

在我的代码中,我有一个集合(在某个地方扩展了 Iterable),每个对象基本上都是一个 LinkedList。
我需要一个用于该集合的迭代器,所以我这样写下来:

public class A{

     LinkedList<B> BList= new LinkedList<B>();

    ...

    public Iterator<B> iterator() {
        return BList.iterator();
    }
}

现在的问题是,如何更改该迭代器的任何方法?
或者更具体地说,如何禁用迭代器的 remove 方法?

谢谢。

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    您可以返回不可修改列表的迭代器:

    import java.util.Collections;
    
    ...
    
    public class A{
    
        LinkedList<B> BList= new LinkedList<B>();
    
        ...
    
        public Iterator<B> iterator() {
            return Collections.unmodifiableList(BList).iterator();
        }
    }
    

    这将使用不允许对列表结构进行任何更改(如删除)的实现来包装您的列表。然后根据包装列表返回一个迭代器。

    【讨论】:

    • 谢谢,但这看起来很“棘手”,这是唯一的方法吗?我问的原因是因为它基本上是一个家庭作业,我不认为他们指望我们知道不可修改列表。除了依赖已经存在的迭代器,有没有办法改变它?再次感谢!
    【解决方案2】:

    如果您想要一个不可修改的列表,请使用此处发布的其他答案。但是,如果您想禁用删除,一种可能的方法是创建一个扩展 Iterator 接口的新类,但其 remove() 方法会引发异常(或根本不执行任何操作)并相互转发原始迭代器对象的方法:

    public class MyIterator implements Iterator {
        private Iterator wrappedIterator;
    
        public MyIterator( Iterator it ) {
            wrappedIterator = it;
        }
    
        public void remove( blabla ) {
            //do nothing or raise an error, whatever floats your boat
        }
    
        public void otherIteratorMethod() {
            wrappedIterator.otherIteratorMethod();
        }
     }
    

    【讨论】:

    • 是的,这就是我想我应该做的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2019-10-31
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多