如何在java中迭代时在List中添加元素?

hs1rzwqc  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(250)

假设我有一个列表:

List<String> list = new ArrayList<>();
list.add("a");
list.add("h");
list.add("f");
list.add("s");

在遍历这个列表的时候,我想在列表的末尾添加一个元素,但是我不想遍历新添加的元素,也就是说,我想一直迭代到列表的初始大小。

for (String s : list)
     /* Here I want to add new element if needed while iterating */

有人能告诉我该怎么做吗?

93ze6v8z

93ze6v8z1#

为了帮助实现这一点,我创建了一个函数,使之更容易实现。

public static <T> void forEachCurrent(List<T> list, Consumer<T> action) {
    final int size = list.size();
    for (int i = 0; i < size; i++) {
        action.accept(list.get(i));
    }
}

示例

List<String> l = new ArrayList<>();
    l.add("1");
    l.add("2");
    l.add("3");
    forEachCurrent(l, e -> {
        l.add(e + "A");
        l.add(e + "B");
        l.add(e + "C");
    });
    l.forEach(System.out::println);
isr3a4wc

isr3a4wc2#

我们可以使用for循环在列表中迭代时存储整数值。

import java.util.*;

class ArrayListDemo{
    public static void main(String args[]){
      Scanner scanner = new Scanner(System.in);
      List<Integer> list = new ArrayList<Integer>();
      System.out.println("Enter the number of elements you wanna print :");
      int n = scanner.nextInt();
      
      System.out.println("Enter the elements :");
      for(int i = 0; i < n; i++){
          list.add(scanner.nextInt());
      }
      
      System.out.println("List's elements are : " + list);
      
      /*Like this you can store string while iterating in java using forloop*/

      List<String> list1 = new ArrayList<String>();
      System.out.println("Enter the number of elements you wanna store or print : ");
      int nString = scanner.nextInt();
      System.out.println("Enter the elements : ");
      for(int i = 0; i < nString; i++){
          list1.add(scanner.next());
      }
      System.out.println("Names are : " + list1);
      scanner.close();
   }
 }

输出:

Enter the number of elements you wanna print : 
5 
Enter the elements : 
11 
12 
13 
14 
15 
List's elements are : [11, 12, 13, 14, 15] 
Enter the number of elements you wanna store or print : 
5 
Enter the elements : 
apple 
banana 
mango 
papaya
orange 
Names are : [apple, banana, mango, papaya, orange]
kx5bkwkv

kx5bkwkv3#

你不能用foreach语句来做这个,foreach在内部使用了一个迭代器:
这个类的iterator和listIterator方法返回的迭代器是故障快速的:如果在迭代器创建之后的任何时候,列表的结构被修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。
(From数组列表javadoc)
在foreach语句中,你不能访问迭代器的add方法,而且在任何情况下,这都不是你想要的add类型,因为它不会在末尾追加。你需要手动遍历列表:

int listSize = list.size();
for(int i = 0; i < listSize; ++i)
  list.add("whatever");

请注意,这只对允许随机访问的列表有效。您可以通过检查列表是否实现了RandomAccess标记接口来检查此功能。ArrayList具有随机访问。链表没有。

gpnt7bae

gpnt7bae4#

循环访问列表的副本并向原始列表添加新元素。

for (String s : new ArrayList<String>(list))     
{
    list.add("u");
}

参见How to make a copy of ArrayList object which is type of List?

bweufnob

bweufnob5#

只需迭代老式的方法,因为您需要显式的索引处理:

List myList = ...
...
int length = myList.size();
for(int i = 0; i < length; i++) {
   String s = myList.get(i);
   // add items here, if you want to
}
qyuhtwio

qyuhtwio6#

你可以迭代原始列表的副本(克隆):

List<String> copy = new ArrayList<String>(list);
for (String s : copy) {
    // And if you have to add an element to the list, add it to the original one:
    list.add("some element");
}

注意,在列表上迭代的同时甚至不可能向列表添加新元素,因为这将导致ConcurrentModificationException

xwbd5t1u

xwbd5t1u7#

我将元素添加到一个新的空的临时列表中,然后使用addAll()将临时列表添加到原始列表中,这样就避免了不必要地复制一个大的源列表。
想象一下当OP的原始列表中有几百万个条目时会发生什么;一段时间内你会吸走两倍的记忆。
除了节省资源之外,这种技术还避免了我们不得不求助于80年代风格的for循环,以及使用在某些情况下可能不受欢迎的有效数组索引。

相关问题