同时修改两个 Set<String> by reretain All



我需要一些如何在迭代过程中通过retainAll修改集合

假设我有下一个代码:

set.forEach(it - > {
set.retainAll(someMapWithSets.get(it))
});

我尝试过迭代器的方法:

for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
String value = iterator.next();
set.retainAll(someMapWithSets.get(value))
}

它不起作用。已引发ConcurrentModificationException

如何正确地做到这一点?

更新。

整个任务是下一个:

我已设置

{A,B,C}

我有集合图,它指示元素是否兼容:

A: B,C - (means A is compatible with B and C and etc) 
B: A,E,C
C: A,B

我需要有集合的地图,其中所有可能的兼容元素组合都存在:

A,B,C

所以,作为解决方案的一部分,我想我可以创建一个方法,只保留给定集合和所选元素的兼容元素。

public static Set<String> define(Set<String> elements, String rootElement) {
Set<String> result = someMapWithElements.get(rootElement);
result.retainAll(elements);
result.add(rootElement);
result.forEach(it -> result.retainAll(someMapWithElements.get(it)))
return result;
}

但很明显我得到了ConcurrentModificationException

在迭代同一对象时,不能使用retainAll方法更改集合。因此,您需要创建一个新的集合(或其他集合(用作迭代变量,如:

new HashSet(set).forEach(it - > {
set.retainAll(someMapWithSets.get(it))
});

CCD_ 4可以被CCD_。

如果在迭代时确实需要更改集合,则需要在Iterator中使用remove方法。

相关内容

最新更新