【问题标题】:Iterating ArrayList where every Element is only called once迭代 ArrayList,其中每个元素只被调用一次
【发布时间】:2014-05-15 15:56:00
【问题描述】:

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

如何做到这一点?

谢谢大家。

【问题讨论】:

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

标签: java arraylist listiterator


【解决方案1】:

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

如果你很高兴新元素存在于原来的元素中,那么你可以以邹邹为例,使用ListIteratoradd()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()
    }
}

输出:

列表 = [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 的可能性。

【讨论】:

    【解决方案2】:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多