Utilisation de l'itérateur sur un TreeSet
SITUATION: j'ai un TreeSet d'Objets personnalisés, et j'ai également personnalisé le Comparateur. J'ai créé un itérateur sur ce TreeSet.
TreeSet<Custom> ts=new TreeSet<Custom>();
Iterator<Custom> itr=ts.iterator();
while(itr.hasNext()){
Custom c=itr.next();
//Code to add a new element to the TreeSet ts
}
QUESTION: eh Bien, je veux savoir que si j'ajoute un nouvel élément à la TreeSet à l'intérieur de la boucle while, alors que nouvel élément de rentrer dans l'ordre immédiatement. En d'autres termes, si j'ajoute un nouvel élément à l'intérieur de la boucle while et il est moins cher que celui que je suis en train de portefeuille en c, puis dans la prochaine itération vais-je obtenir le même élément de c, comme dans la dernière itération?(car après le tri, le nouvel élément qui va occuper une place quelque part avant de l'élément courant).
source d'informationauteur aps | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Si vous ajoutez un élément au cours de votre tour, votre prochaine itérateur appel sera probablement jeter un
ConcurrentModificationException
. Voir le fail-fast comportement dans TreeSet docs.À parcourir et ajouter des éléments, vous pouvez copier à un autre jeu:
ou de créer une collection à part à être fusionné avec
ts
après itération, comme Colin suggère.Vous obtiendrez un java.util.ConcurrentModificationException si vous ajoutez un élément dans le TreeSet à l'intérieur de la boucle while.
De sortie
Pour toutes les collections, comme
List
,Map
,Set
Parce que quand itérateur commence, il peut être mettre un peu de verrouillage .
si vous parcourez la liste à l'aide de itérateur puis cette exception va venir. Je pense que sinon cette boucle sera infinie que vous ajoutez l'élément de l'ensemble de l'itération.
Envisager sans un itérateur:
ce sera très bien .
Afin d'éviter la
ConcurrentModificationException
vous voudrez peut-être consulter monUpdateableTreeSet
. J'ai même ajouté un nouveau cas de test montrant comment ajouter des éléments au cours d'une boucle. Pour être plus exact, vous marquez de nouveaux éléments pour plus tard, l'ajournement de la mise à jour de l'ensemble. Cela fonctionne très bien. Fondamentalement, vous faites quelque chose commeJe suppose que c'est très exactement ce dont vous avez besoin.
:-)
Pour empêcher la ConcurrentModificationException lors de la marche.
Voici ma version de permettre à la haute fréquence de l'insertion dans le TreeSet() et permettre simultanément itérer sur elle. Cette classe d'utiliser un supplément de file d'attente pour stocker l'insertion de l'objet lors de la TreeSet est en cours d'itération.
Alors que la question a déjà été répondu, je pense que le plus satisfaisant réponse se trouve dans javadoc de TreeSet lui-même
Pour éviter les modifications simultanées d'erreur lié à se produire lorsque vous êtes en train de faire de l'insertion, vous pouvez également créer une copie temporaire de l'Ensemble, itérer sur la copie au lieu de cela, et de modifier l'original.