迭代ArrayList,其中每个Element只被调用一次

时间:2014-05-15 15:56:01

标签: java arraylist listiterator

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

如何做到这一点?

谢谢大家。

2 个答案:

答案 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的可能性。

相关问题