【发布时间】:2021-02-23 08:28:56
【问题描述】:
所以我有这个方法应该在集合中找到对,为此我使用了一个嵌套循环。但是,即使我使用的是迭代器,我总是会遇到并发修改异常。我猜想两个迭代器都迭代同一个集合,他们都试图同时修改它,这就是我得到这个异常的原因。您能否通过完成相同的结果来帮助我避免此错误。
private List<Pair<Document, Document>> createPairDocument(List<Document> documentsToIterate){
List<Pair<Document, Document>> pairDocList = new ArrayList<>();
//iterators are used to avoid concurrent modif exception
Iterator<Document> iterator0 = documents.iterator();
while(iterator0.hasNext()){
Document dl0 = iterator0.next();
Iterator<Document> iterator1 = documents.iterator(); //returns new instance of iterator
while(iterator1.hasNext()){
Document dl1 = iterator1.next();
if (dl1.relatedTo(dl0) && dl0.relatedTo(dl1)){
pairDocList.add(Pair.of(dl0, dl1));
//these docs should be removed to avoid creating the same relation again
iterator0.remove();
iterator1.remove();
break;
}
}
}
return pairDocList;
}
【问题讨论】:
-
文档可以与自身相关吗?
-
没有。只对别人。但是我可以在列表中首先拥有文档 A,然后在列表中拥有 B。我首先创建关系 A 到 B,但是当我找到 B 时,我再次创建关系 B - A,这本质上是相同的关系。我尝试只删除 B 而不是两者,但我得到了同样的错误。这可以通过在其位置用空值替换文档并验证在每次迭代中不为空但不是很简单来解决。
标签: java list iterator concurrentmodification