Java 迭代ArrayList,其中每个元素只调用一次

Java 迭代ArrayList,其中每个元素只调用一次,java,arraylist,listiterator,Java,Arraylist,Listiterator,我正在使用ListIterator对ArrayList进行迭代。在遍历ArrayList时,我使用ListIterator添加和删除元素。 问题是每次我添加一个元素时,新元素也会被迭代。但是我只想迭代列表中的初始元素,而不是新添加的元素 如何做到这一点 谢谢大家。您可能正在寻找set方法: import java.util.*; public class IterDemo { public static void main(String[] args) { List&l

我正在使用ListIterator对ArrayList进行迭代。在遍历ArrayList时,我使用ListIterator添加和删除元素。 问题是每次我添加一个元素时,新元素也会被迭代。但是我只想迭代列表中的初始元素,而不是新添加的元素

如何做到这一点


谢谢大家。

您可能正在寻找
set
方法:

import java.util.*;

public class IterDemo {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList() {{
            add("one");
            add("two");
            add("three");
        }};

        System.out.println("Before: " + arrayList);

        ListIterator<String> iter = arrayList.listIterator();
        while(iter.hasNext()) {
            String s = iter.next();
            iter.set(s.toUpperCase());
        }

        System.out.println("After: " + arrayList);
    }
}
import java.util.*;
公共类IterDemo{
公共静态void main(字符串[]args){
List arrayList=新建arrayList(){{
添加(“一”);
添加(“两”);
添加(“三”);
}};
System.out.println(“之前:“+arrayList”);
ListIterator iter=arrayList.ListIterator();
while(iter.hasNext()){
字符串s=iter.next();
iter.set(s.toUpperCase());
}
System.out.println(“之后:“+arrayList”);
}
}

这取决于您希望结果列表的外观

如果您对新元素存在于原来的元素中感到满意,那么您可以以ZouZou的示例为例,使用
ListIterator
add()
remove()
方法

final List<Integer> list = new ArrayList<Integer>(Arrays.asList(2,3,4,5,6));
final ListIterator<Integer> ite = list.listIterator();
while( ite.hasNext() ) {
    if( ite.next() %2 == 0 ) {
        ite.add( 7 );
    }
    else {
        ite.remove(); //removes the last value returned by next()
    }
}
final List List=newarraylist(Arrays.asList(2,3,4,5,6));
final ListIterator ite=list.ListIterator();
while(ite.hasNext()){
如果(ite.next()%2==0){
增加(7);
}
否则{
ite.remove();//删除next()返回的最后一个值
}
}
输出:

列表=[2,7,4,7,6,7]

但是,如果希望新元素都在原始元素之后,那么第二个集合是最佳选择

final List<Integer> list = new ArrayList<Integer>(Arrays.asList(2,3,4,5,6));
final List<Integer> newList = new ArrayList<Integer>(list);
final ListIterator<Integer> ite = list.listIterator();
while( ite.hasNext() ) {
    final Integer next = ite.next();
    if( next % 2 == 0 ) {
        newList.add( 7 );
    }
    else {
        newList.remove(next);
    }
}
final List List=newarraylist(Arrays.asList(2,3,4,5,6));
最终列表newList=新的ArrayList(列表);
final ListIterator ite=list.ListIterator();
while(ite.hasNext()){
最终整数next=ite.next();
如果(下一个%2==0){
新增(7);
}
否则{
newList.remove(下一步);
}
}
输出:

newList=[2,4,6,7,7]


就我个人而言,我一直喜欢使用第二个集合方法,因为它避免了通过索引进行迭代时出现
ConcurrentModificationException
的可能性。

No插入的新元素不会被迭代。如文档所述,“新元素插入到隐式游标之前:对下一步的后续调用将不受影响”,例如程序:
List List=new ArrayList(Arrays.asList(2,1));ListIterator ite=list.ListIterator();while(ite.hasNext()){if(ite.next()%2==0){ite.add(4);}}
正确终止并输出
[2,4,1]
。您还可以将元素添加到临时列表,然后将其添加到loop.CopyOnWriteArrayList之后的原始列表中?