即使使用迭代器,我也无法删除列表的第一和第二元素。
我已阅读以下主题,但无法解决我的问题(那些问题最相关,但我也检查了其他材料):
ConcurrentModificationException when trying remove element from list
所以我的代码如下:
List<List<String>> list = cnf.read();
List<List<String>> nlist = new ArrayList<>();
for (List<String> l : list) {
if (l.size() <= 3) {
nlist.add(l);
} else {
int size = l.size();
while (size > 3) {
List<String> three = l.subList(0, 2);
three.add("Y" + (count++));
//Iterator itr = l.iterator();
ListIterator itr = l.listIterator();
int v = 0;
while (itr.hasNext()) {
itr.next();
if (v == 0 || v == 1){
itr.remove();
v++;
}
}
l.add(0, "Y" + (count++));
size--;
nlist.add(three);
}
nlist.add(l);
}
}
for (List<String> l : nlist) {
System.out.println(l.toString());
System.out.println(l.size());
}
我在这里的打印语句中收到ConcurrentModificationException:
System.out.println(l.toString());
我也尝试在2个for循环中使用迭代器,但这似乎没有什么不同! 我是刚开始发布问题的人,所以如果我做得对,请通知我! 谢谢。
答案 0 :(得分:0)
经过长时间的调试,这是解决方法。
sublist函数按引用而不是按值传递,由ArrayList.subList调用创建的子列表保留对原始列表的引用,并直接访问其elementData数组。
因此,将元素添加到“三个”列表时,我们将更改原始列表的状态。发生在这里:
three.add(“ Y” +(count ++));
对此特定情况进行修复的一种方法是通过以下方式创建和初始化“三个”列表:
String one = l.get(0);
String two = l.get(1);
List<String> three = new ArrayList<>();
three.add(one);
three.add(two);
three.add("Y" + (count));
这使我们可以在不获取并发异常(ConcurrentModificationException)的情况下操作列表。但是,如果要处理大列表,建议您使用另一种不太硬编码的方法来创建列表。
我会将这个主题标记为已回答,希望它对人们有所帮助。