2013-08-03 2 views
2

J'ai un problème avec les ensembles/itérateurs Java. J'exécute du code qui itère sur les éléments d'un ensemble de hachage, les supprime après leur utilisation mais supprime également les éléments jugés inutiles à parcourir dans la boucle. J'ajoute aussi des éléments à la boucle. Voici un exemple de code:Modification d'un ensemble pendant l'itération (Java)

Set<Integer> thisSet = new HashSet<Integer>(); 
// add elements into set 
while (!thisSet.isEmpty()) { 
    int value = thisSet.iterator().next(); 
    thisSet.remove(value); 
    // more remove and add operations 
} 

J'ai choisi des ensembles de hachage parce que je pensais que les opérations de suppression au cours de la boucle serait beaucoup plus rapide que lors de l'utilisation d'une liste. Le problème est que les statistiques me montrent que si l'ensemble devient grand, interroger une valeur de l'ensemble prend beaucoup de temps (je suppose en raison de la création d'un itérateur à chaque fois?). Est-ce que quelqu'un a des suggestions sur la façon d'améliorer cela?

Merci!

+3

Cette réponse n'est pas une réponse, mais ne devrait-elle pas être supprimée par l'itérateur? –

+0

Je suis d'accord avec @HovercraftFullOfEels. Pourquoi ne pas utiliser l'itérateur pour supprimer des éléments? –

+2

Pourquoi les supprimer du tout? Vous pouvez simplement effacer ou supprimer l'ensemble après la boucle. –

Répondre

0

Vous n'avez pas assez de réputation pour ajouter un commentaire à Hovercraft Full Of Eels, mais il a absolument raison. Supprimer un élément d'un ensemble sans utiliser d'itérateur conduira éventuellement à une exception ConcurrentModificationException d'une manière ou d'une autre. +1

Si nous regardons cela sous l'angle des structures de données, vous avez besoin d'une infrastructure de données sauvegardée par une liste liée pour accélérer l'insertion/la suppression. Voir Listes liées par rapport aux tableaux dynamiques @https://en.wikipedia.org/wiki/Linked_list pour l'insertion/suppression des limites O(). En fin de compte, ma suggestion est de sauvegarder votre Set par un objet LinkedHashSet et d'utiliser un profileur pour examiner les temps d'exécution pour les exemples d'entrées que vous allez utiliser.