7
votes

Java itérateurs et pour-chaque boucle. Toute façon d'accéder à l'itérateur sous-jacent?

J'aime beaucoup la construction pour chaque boucle ( pour (t e: ibler) ) dans Java qui fonctionne sur n'importe quel ibler car il fait Dans de nombreux cas très faciles à lire et à écrire du code.

Je me demande si s'il y a une manière que je puisse accéder à l'itérateur sous-jacent d'une telle boucle. Cela peut être obligatoire si je veux utiliser le Supprimer () de l'itérateur.


0 commentaires

6 Réponses :


17
votes

Non, tout le point de la boucle pour chacune est de résumer l'itérateur sous-jacent.

Si vous en avez besoin, vous devez le déclarer.


1 commentaires

Et lorsque vous le déclarez, il devrait s'agir d'un écouteur si vous envisagez de supprimer des éléments de la liste.



1
votes

Utilisez A pour boucle à la place.


0 commentaires

4
votes

Non, vous ne pouvez pas supprimer les objets dans A pour chaque boucle.

Utilisez cela à la place: P>

Iterator<Type> it = collection.iterator();

while (it.hasNext()) {
   if (it.next().shouldBeRemoved()) {
       it.remove();
   }
}


2 commentaires

Je préfère le pour idiom plutôt que le pendant idiome car il conserve la portée de l'itérateur plus petit.


@Dty: Il existe un point valide dans votre désir de garder la portée de toutes les variables aussi étroite que possible. Mais quant à moi, la lisibilité du code est sur la première place. Ma version pourrait être lue presque comme une phrase normale: «Bien que Itérateur dispose d'un élément suivant, procédez comme suit: ...» et le vôtre semble très encombrant. Donc, si nous voulons garder des avantages des deux approches, il vaut la peine d'extraire le code du minime à une méthode distincte. C'est le meilleur que nous puissions faire avec ce problème, IMHO.



0
votes

Modification des données a une sensation erronée à cela, crée simplement une nouvelle version (ou une nouvelle collection) et ajoutez les articles que vous souhaitez y rester, les autres temps sont perdus dans la boucle (( un peu **


1 commentaires

Vous n'avez jamais entendu parler de la programmation fonctionnelle



1
votes

Si la collection est raisonnablement petite, vous pouvez également utiliser une copie de la collection à itérer si vous souhaitez pouvoir supprimer des éléments afin que vous n'ayez pas à agir comme si vous avez deux collections.

CollectionUtils.filter(collection, new Predicate(){
        boolean evaluate(Object object){return true;}
    });


0 commentaires

1
votes

Vous êtes correct, l'utilisation d'un itérateur prend en charge la possibilité de supprimer un objet d'une collection source en toute sécurité, en appelant Supprimer () sur l'itérateur lui-même. Le point ici est d'éviter une exception concurrenteModifiedException qui implique qu'une collection a été modifiée lorsqu'un itérateur était ouvert contre elle. Certaines collections vous permettront de vous échapper avec la suppression ou l'ajout d'éléments à une collection tout en itération, mais appelant Supprimer () sur l'itérateur est une pratique plus sûre.

Mais itérateur prend en charge un cousiterraator Dérivé et plus puissant Lisiterator (fort> disponible que dans les listes, prend en charge l'ajout et la suppression d'une liste lors de l'itération, ainsi que du défilement bidirectionnel via des listes.


0 commentaires