我用过
>>> list(izip_longest(*([iter(li)] * n)))
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15), (16, 17, 18, 19), (20, None, None, None)]
定义数组的arrayList 但是当我想要引用这个arrayList中的元素时,我写道:
ArrayList<char[]> record = new ArrayList<char[]>();
它不起作用,并且有如下错误消息:
java.util.ConcurrentModificationException
在行
for(char[] char1 : record){
if(Arrays.equals(char1, char2)){
return false;
}
record.add(char2);
}
我的代码出了什么问题? 谢谢!
答案 0 :(得分:0)
看一下ArrayList的javadoc:
此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出一个ConcurrentModificationException。
你在这一行上使用的增强的for循环:
for(char[] char1 : record){
隐式创建一个列表迭代器并迭代它。
问题就出现了:
record.add(char2);
当您在迭代时修改列表时,您需要使用列表的迭代器来迭代并适当添加。
一种可能的解决方案是手动检索列表迭代器并进行迭代,这将公开对add()
方法的访问,该方法可用于在迭代时安全地将项添加到列表中。例如:
// Here we manually retrieve the list iterator to work with
ListIterator<char[]> iter = record.listIterator();
// Iterating through the entire list is done via the `hasNext()` method
while(iter.hasNext()){
char[] char1 = iter.next();
if(Arrays.equals(char1, char2)){
return false;
}
// Note: the add() method can only be called once per next() method call
iter.add(char2);
}
注意,一旦添加,列表迭代器最终将迭代到新添加的元素中。为了防止这种情况,您可以将新元素添加到临时保留列表中,然后根据需要进行传输(例如迭代完成时)。
答案 1 :(得分:-1)
迭代时不能修改列表,因为这可能会创建一个无限循环的无限循环。
如果您要完成的工作是将n
个char2
副本添加到record
的末尾,其中n
是数组的数量char1
在char2
中第一次出现char2
之前不等于record
,那么您应该只计算有多少,然后在事实之后添加许多副本或类似的东西。
ArrayList<char[]> record2 = new ArrayList<char[]>();
for(char[] char1 : record){
if(Arrays.equals(char1, char2)){
break;
}
record2.add(char2);
}
record.addAll(record2);
以上就是我要做的。我改为添加一个不同的列表,然后在它退出之后,将它们全部添加到record
的末尾。