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

如何在java中迭代时在列表中添加元素?,java,collections,arraylist,loops,Java,Collections,Arraylist,Loops,假设我有一个如下列表: List<String> list = new ArrayList<>(); list.add("a"); list.add("h"); list.add("f"); list.add("s"); 有人能告诉我怎么做吗?您可以在原始列表的副本(克隆)上迭代: List<String> copy = new ArrayList<String>(list); for (String s : copy) { // And

假设我有一个如下列表:

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

有人能告诉我怎么做吗?

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

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");
}
List copy=newarraylist(列表);
for(字符串s:复制){
//如果必须将元素添加到列表中,请将其添加到原始元素中:
列表。添加(“某些元素”);
}

请注意,在对列表进行迭代时,甚至不可能向列表中添加新元素,因为这将导致出现
ConcurrentModificationException

迭代列表的副本并向原始列表中添加新元素

for (String s : new ArrayList<String>(list))     
{
    list.add("u");
}
for(字符串s:newarraylist(列表))
{
列表。添加(“u”);
}

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

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
}
List myList=。。。
...
int length=myList.size();
for(int i=0;i
为此,我将元素添加到一个新的空tmp列表中,然后使用
addAll()
将tmp列表添加到原始列表中。这样可以防止不必要地复制大型源列表

想象一下,当OP的原始列表中有几百万项时会发生什么;在一段时间内,你会消耗掉两倍的记忆


除了节省资源外,这种技术还可以防止我们不得不求助于80年代风格的循环,并使用在某些情况下可能不吸引人的有效数组索引。

您不能使用foreach语句。foreach在内部使用迭代器:

此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何时候进行了结构修改 创建迭代器后的时间,以任何方式,除了通过 迭代器自己的remove或add方法,迭代器将抛出 ConcurrentModificationException

(来自ArrayList javadoc)

在foreach语句中,您无权访问迭代器的add方法,而且在任何情况下,这仍然不是您想要的add类型,因为它不会在末尾追加。您需要手动遍历列表:

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

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

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

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));
    }
}
publicstaticvoidforeachcurrent(列表,消费者操作){
final int size=list.size();
对于(int i=0;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);
listl=newarraylist();
l、 添加(“1”);
l、 添加(“2”);
l、 添加(“3”);
前向电流(l,e->{
l、 添加(e+“A”);
l、 添加(e+“B”);
l、 加上(e+“C”);
});
l、 forEach(System.out::println);

不,不会。当使用迭代器并在迭代过程中添加Alement时,会出现这种情况,但在这里自己进行迭代时不会出现这种情况。OPs希望“迭代到初始大小”。
    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);