如何在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);