2 votes

Il n'est pas permis de manipuler le TreeSet dans une boucle for.

J'ai un TreeSet qui contient des entiers. Je boucle dans cet ensemble et "consomme" les entiers un par un. Au cours de chaque boucle, je dois augmenter de 1 les entiers restants, non consommés.

Par exemple, je commence avec un ensemble de quatre valeurs : 2, 3, 5, 8 . Après la première boucle où je consomme 2 le résultat devrait être un ensemble avec ce contenu 4, 6 , 9 . Après la deuxième boucle, où 4 est consommée, elle doit être 7, 10 et ainsi de suite.

  • Je n'ai pas besoin que la dernière valeur soit augmentée d'un cran après avoir été consommée (mais c'est ok si c'est le cas).
  • Il n'y a pas de problème si les valeurs consommées restent dans l'ensemble, et il importe peu qu'elles soient à leur valeur initiale ou augmentée. En d'autres termes, après la deuxième boucle, il serait correct que l'ensemble contienne 2, 3, 7, 10 o 2, 4, 7, 10 ou simplement 7, 10 . (L'ensemble va être jeté après cette boucle)

Voici mon code

    for (Integer i : positionSet) {
        TreeSet <Integer> tmpSet = new TreeSet<>(); 
        //use i for something
        //positionSet.remove(i); //I tried with this both on and off, but it made no difference
        for (Integer j : positionSet) {
            tmpSet.add(j + 1);
        }
        positionSet.clear();
        positionSet.addAll(tmpSet);
    }

Il s'écrase au deuxième tour avec un java.util.ConcurrentModificationException Je suppose que cela est dû au fait que j'ai modifié le jeu utilisé dans l'en-tête de la boucle.

Comment modifier le contenu de l'ensemble tout en le parcourant en boucle ? J'ai essayé de copier le jeu dans les deux sens de plusieurs manières différentes, mais le code échoue constamment avec le même message d'erreur. Je ne dois pas modifier l'ensemble pendant la boucle, or la modification de l'ensemble est le but même de cette boucle.//

2voto

Mark Jeronimus Points 665

Vous ne pouvez pas modifier une structure de données pendant l'itération, sauf pour les dispositions autorisées. Pour un itérateur, ceci est seulement Iterator.remove() mais un for-each n'a pas cette disposition, et vous ne pouvez pas non plus affecter d'autres éléments.

Le mieux que vous puissiez faire est de créer une boucle while indépendante de la structure de données :

while (!positionSet.isEmpty()) {
    Integer i = <take one element out of positionSet somehow>;
    //positionSet.remove(i); //remove if the previous line didn't already remove it

    //use i for something
    TreeSet <Integer> tmpSet = new TreeSet<>();
    for (Integer j : positionSet) {
        tmpSet.add(j + 1);
    }
    positionSet.clear();
    positionSet.addAll(tmpSet);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X