Modification concurrente de deux Set <String> par retentionAll
J'ai besoin de savoir comment modifier l'ensemble lors de l'itération par keepAll
Disons que j'ai le code suivant:
set.forEach(it - > {
set.retainAll(someMapWithSets.get(it))
});
J'ai essayé une approche avec des itérateurs:
for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
String value = iterator.next();
set.retainAll(someMapWithSets.get(value))
}
Cela n'a pas fonctionné. ConcurrentModificationExceptiona été jeté.
Comment faire ça correctement?
Mettre à jour.
Toute la tâche est la suivante:
J'ai mis
{A,B,C}
Et j'ai une carte des ensembles qui indique si les éléments sont compatibles:
A: B,C - (means A is compatible with B and C and etc)
B: A,E,C
C: A,B
J'ai besoin d'une carte d'ensembles où toutes les combinaisons possibles d'éléments compatibles sont présentes:
A,B,C
Donc, comme je fais partie de la solution, j'ai pensé que je pourrais créer une méthode qui ne conserve que les éléments compatibles pour l'ensemble donné et l'élément choisi.
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;
}
Mais évidemment je reçois ConcurrentModificationException
Réponses
Vous ne pouvez pas modifier un ensemble à l'aide de la retainAllméthode lors de l'itération sur ce même objet. Par conséquent, vous devrez créer un nouvel ensemble (ou une autre collection) à utiliser comme variable d'itération, comme:
new HashSet(set).forEach(it - > {
set.retainAll(someMapWithSets.get(it))
});
HashSetpeut être remplacé par TreeSetou tout autre objet défini qui convient.
Si vous avez réellement besoin de changer l'ensemble pendant l'itération, vous devrez utiliser la removeméthode dans Iterator.