Java 为什么像add(Object o)、remove(Object o)don';是否在迭代中不工作以删除或更新?

Java 为什么像add(Object o)、remove(Object o)don';是否在迭代中不工作以删除或更新?,java,iterator,Java,Iterator,我必须检查0-10个数字的ArrayList集合中的数字是否为偶数。使用迭代器,我必须打印数组列表中的所有偶数,并从数组列表中删除奇数 package hemantdhanuka; import java.util.*; public class Iteratorr { public static void main( String [] args) { ArrayList v = new ArrayList (); for( int i = 0;

我必须检查0-10个数字的
ArrayList
集合中的数字是否为偶数。使用
迭代器
,我必须打印
数组列表
中的所有偶数,并从
数组列表
中删除奇数

package hemantdhanuka;

import java.util.*;

public class Iteratorr {

    public static void main( String [] args) {
        ArrayList v = new ArrayList ();
        for( int i = 0; i <= 10; i++ ) {
            v.add ( i );
        }
        System.err.println ( v );
        Iterator i = v.iterator ();
        /*while ( i.hasNext () ) {
            Integer a = ( Integer ) i.next ();
            if ( i % 2 == 0 ) {
                System.out.println ( i );
            } else {
                i.remove ();
            }
        }       
        System.out.println ( v );
        */
        while( i.hasNext () ) {
            Integer a = ( Integer) i.next ();
            if ( a % 2 == 0 ) {
                System.out.println ( a );
            } else {
                v.remove ( a );
            }
        }
        System.out.println ( v );
    }
}
hemantdhanuka包装;
导入java.util.*;
公共类迭代器{
公共静态void main(字符串[]args){
ArrayList v=新的ArrayList();

对于(int i=0;i签出List.listIterator()。listIterator接口有一个remove()方法。

它不起作用,因为您正在以迭代器不知道的方式更改容器

考虑
ArrayList
。它有“n”个元素和一个返回迭代器的方法(依次返回每个“n”元素)。您可以编写自己的迭代器

class MyArrayListIterator<T> implements Iterator<T> {
    private final ArrayList<T> list;
    private int index;

    MyArrayListIterator(ArrayList<T> lst) {
        list = lst;
        index = 0;
    }

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

    public T next() {
        return list.get(index++);
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}
类MyArrayListator实现迭代器{ 私人最终阵列列表; 私有整数索引; MyArrayList寄存器(ArrayList lst){ 列表=lst; 指数=0; } 公共布尔hasNext(){ 返回索引
假设列表包含10,11,13,14

使用此迭代器并直接删除奇数项(不使用迭代器的删除方法):

  • 返回10;索引增加到1
  • 返回11;索引增加到2;从列表中删除11
  • 返回14(因为列表现在是“10,13,14”,索引==2处的项是14!)
请注意,迭代器“跳过”了“13”,因为迭代器推进了每个调用,并且列表将移动项缩小到较低的索引

要使迭代器在修改
ArrayList
时正常工作,列表必须告诉在其上运行的所有迭代器修改(可以有多个迭代器,即使没有线程)。或者,迭代器本身必须进行修改

由于
ArrayList
不存储对在其上运行的每个活动迭代器的引用,因此前一个选项不可能。相反,
ArrayList
维护一个简单的状态值,在对其进行修改时会发生更改。迭代器可以检查状态的意外更改,如果发现,可以抛出一个
 ConcurrentModificationException
,警告程序员其代码在集合上的操作不正确


请注意上面的“can check”和“can throw”。迭代器不需要这样做;这是一种帮助程序员避免错误代码的“尽力”检查。

最简单的答案是使用if条件检查for循环本身内部的奇偶数,我认为没有必要使用迭代器


如果必须使用迭代器,则创建2个ArrayList并根据If条件填充它们。

它不起作用
不是有效的问题陈述。这可能意味着什么。不编译?运行时异常?意外行为?尽可能具体。请仔细阅读文档,了解迭代器
,其中早期状态
从基础集合中删除此迭代器返回的最后一个元素(可选操作)。每次调用next()时只能调用一次此方法。如果在迭代过程中以除调用此方法以外的任何方式修改了基础集合,则迭代器的行为是未指定的。
。因此,在使用
迭代器时,始终使用
迭代器的
remove()
方法,而不是调用
remove()
在列表中,这可能会引发未指定的行为。您需要详细说明您的答案。这应该是一个注释。是的,它对我有效。在使用netbeans时的迭代器接口文档中只显示迭代器接口有三种方法1.hasNext(---)、2.Next(---)3.remove()…这里只写了定义..我如何才能看到迭代器接口的实现类..在netbeans IDE中的何处和如何上面的
迭代器
只是一个示例,用于说明为什么不能在迭代期间使用列表的
添加
删除
方法。每个集合类都有自己的迭代器实现具体实现细节请参见Java集合的源代码(如有必要,请使用调试器进入代码)。但事实仍然存在:在迭代过程中修改集合可能会使现有迭代器无效。请使用迭代器的remove方法在迭代过程中删除元素。请参见第780行