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

Java 如何从泛型类中的私有ArrayList中删除元素,java,generics,Java,Generics,我有一个泛型类MyArray,其中私有成员是ArrayList,内部实现了迭代器 在Main中给出了一些带有字符串的MyArray,我想从中删除所有的“test”。。。问题在于迭代器中哪个方法remove不起作用 下面是类的外观: public class MyArray<E> { private ArrayList<E> list; public MyArray() { list = new ArrayList&

我有一个泛型类MyArray,其中私有成员是ArrayList,内部实现了迭代器

在Main中给出了一些带有字符串的MyArray,我想从中删除所有的“test”。。。问题在于迭代器中哪个方法remove不起作用

下面是类的外观:

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());
    }

}

您定义的
MyIterator
不会覆盖
Iterator.remove()
和 在
迭代器
接口中定义的
remove()
被定义为引发
不支持操作异常的默认方法

default void remove() {
    throw new UnsupportedOperationException("remove");
}
因此,只需重写它即可有效地删除迭代元素。

您可以依赖于
ArrayList.Itr
code:

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();
    }
}
public void remove(){
if(lastRet<0)
抛出新的非法状态异常();
checkForComodification();
试一试{
ArrayList.this.remove(lastRet);
游标=lastRet;
lastRet=-1;
expectedModCount=modCount;
}捕获(IndexOutOfBoundsException ex){
抛出新的ConcurrentModificationException();
}
}

在接口中,您需要在MyIterator中实现要调用的每个迭代器方法

您需要覆盖
迭代器中的
remove()

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

    public Iterator<E> iterator() {
        return list.iterator();
    }
公共迭代器迭代器(){
return list.iterator();
}

您需要覆盖
迭代器中的
remove()
。但是,让您的
iterator()
方法返回
list.iterator()
,而不是自己实现它是最容易的
on
Iterator i=b.Iterator()其中
MyArray b=newmyarray()。因此,您使用的是
类MyIterator implements Iterator
,它不提供
remove()
方法的实现,默认情况下,
抛出新的UnsupportedOperationException(“remove”)。使用正确的实现重写该方法。感谢@Pshemo的解释。我在MyIterator中重写了remove(),它工作得很好。我想在我的代码中实现类似迭代器的功能,但感谢您的建议。
    public Iterator<E> iterator() {
        return list.iterator();
    }