繁体   English   中英

如何从泛型类的私有ArrayList中删除元素

[英]How to remove element from private ArrayList in generic class

我有通用类MyArray,其中私有成员是ArrayList,并且内部实现了迭代器。

在Main中提供了一些带有字符串的MyArray,我想从中删除所有的“测试” ...问题出在迭代器中,哪种方法删除不起作用

这是类的样子:

public class MyArray<E> {
        private ArrayList<E> list;

        public MyArray() {
            list = new ArrayList<E>();
        }

        public int length() {    return list.size(); }

        public E at(int pos) {    return list.get(pos); }

        public void add(E val) {    list.add(val); }

        public void remove(int pos) {    list.remove(pos); }

        public class MyIterator implements Iterator<E>{
            int index;

            @Override
            public boolean hasNext() {
                return index < list.size();
            }

            @Override
            public E next() {
                if (!hasNext())
                    throw new NoSuchElementException("no next value");
                E tmp = list.get(index);
                index++;
                return tmp;
            }

        }

        public Iterator<E> iterator() {
            return new MyIterator();
        }

    public static void main(String[] args) {        
        MyArray<String> b = new MyArray<String>();
        b.add("This");
        b.add("is");
        b.add("test");
        b.add("please");
        b.add("delete");
        b.add("all");
        b.add("test");

        Iterator<String> iter = b.iterator();
        while(iter.hasNext())
            System.out.println(iter.next());

        for(Iterator<String> i = b.iterator(); i.hasNext(); ) {
            String tmp = i.next();
            if (tmp.equals("test"))
                i.remove();
        }

        Iterator<String> ite = b.iterator();
        while(ite.hasNext())
            System.out.println(ite.next());
    }

}

我得到的异常是:

Exception in thread "main" java.lang.UnsupportedOperationException: remove
    at java.util.Iterator.remove(Unknown Source)
    at cas1.MyArray.main(MyArray.java:71)

您需要在Iterator重写remove()

但是,最简单的方法是让您的iterator()方法返回list.iterator() ,而不是自己实现:

    public Iterator<E> iterator() {
        return list.iterator();
    }

您定义的MyIterator不会覆盖Iterator.remove()并且在Iterator接口中定义的remove()被定义为引发UnsupportedOperationException的默认方法:

default void remove() {
    throw new UnsupportedOperationException("remove");
}

因此,只需重写它即可有效地删除迭代的元素。

您可以依赖ArrayList.Itr代码:

public void remove() {
    if (lastRet < 0)
        throw new IllegalStateException();
    checkForComodification();

    try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
    } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
    }
}

接口中的Iterator ,并且您需要在打算调用的MyIterator中实现每个Iterator方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM