Java 为什么像add(Object o)、remove(Object o)don';是否在迭代中不工作以删除或更新?
我必须检查0-10个数字的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;
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!)
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行