我使用ListIterator迭代ArrayList。我正在使用ListIterator在迭代ArrayList时添加和删除Elements。 问题是每次我添加一个元素时,新元素也会被迭代。但我想只迭代列表中的初始元素而不是新添加的元素。
如何做到这一点?
谢谢大家。
答案 0 :(得分:0)
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);
}
}
答案 1 :(得分:0)
这取决于您希望结果列表的样子。
如果您对最初存在的元素中存在的新元素感到满意,那么您可以使用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()
}
}
输出:
list = [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);
}
}
输出:
newList = [2,4,6,7,7,7]
就个人而言,我一直都喜欢使用第二种收集方法,因为它避免了在通过索引进行迭代时ConcurrentModificationException
的可能性。