Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1293 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Pourquoi utiliser un iterator au lieu d'un for ? [résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pourquoi utiliser un iterator au lieu d'un for ? [résolu]

n°2021952
pharaon200​5
Par Osiris et par Apis
Posté le 08-09-2010 à 20:34:18  profilanswer
 

En gros, quel est l'intérêt d'utiliser un iterator au lieu d'une boucle for ou while ?
 
Question existentielle [:paco fpg:5]


Message édité par pharaon2005 le 12-09-2010 à 20:00:06
mood
Publicité
Posté le 08-09-2010 à 20:34:18  profilanswer
 

n°2021957
Joel F
Real men use unique_ptr
Posté le 08-09-2010 à 21:38:36  profilanswer
 

ca hausse le niveau d'abstraction

n°2022200
pharaon200​5
Par Osiris et par Apis
Posté le 09-09-2010 à 20:31:55  profilanswer
 

En quoi ca hausse le niveau d'abstraction ? et pour quoi faire ?
:)


Message édité par pharaon2005 le 09-09-2010 à 20:34:35
n°2022277
gelatine_v​elue
Posté le 10-09-2010 à 12:03:05  profilanswer
 

Une différence majeure est que un intérateur va itérer du noeud courant vers le suivant, cad qu'il n'y a rien ou presque à faire, juste suivre un pointeur.
 
Un for va impliquer de pointer les éléments de la liste par liste.get(i) par ex. Du coup à chaque itération la liste va devoir chercher les éléments parmi tous ses éléments, ce qui est plu long potentiellement.
 
Je ne sais pas si c'est la seule raison, mais ça en est une.

n°2022393
pharaon200​5
Par Osiris et par Apis
Posté le 11-09-2010 à 00:14:13  profilanswer
 


Mouai, mouai ...
 
Puisque personne ne sait répondre clairement,
Il me semble que la différence c'est que l'itérator est thread-safe (ConcurrentModificationException) alors qu'en utilisant un for, on ne se prémunit pas d'une modification en cours de lecture.
[:idee]

n°2022399
kadreg
profil: Utilisateur
Posté le 11-09-2010 à 09:46:19  profilanswer
 

rien a voir. La concurentModificationException n'est pas une notion sur les thread, tu peux lever cette exception en mono thread (rajoute un élément sur ta collection dans le boucle de ton itérator).
 
Non, la vraie raison, c'est : "je parcours ma collection sans tenir compte du fait qu'il s'agit d'une collection indexée ou une collection chainée, donc sans m'interresser du tout au format interne de ma collection, boite noire, tout ça"


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°2022407
pharaon200​5
Par Osiris et par Apis
Posté le 11-09-2010 à 11:55:37  profilanswer
 


Que ce soit une liste chainée (LinkedList) ou une liste indexée (ArrayList), on a la possibilité d'itérer dessus via un for sans se soucier du type de list.
 
Par contre tu as raison pour les Set, car je viens de remarquer qu'ils implémentent bien l'interface Collection mais qu'il n'y a pas de méthode get(int index) dessus !
Du coup obligé de passer par un iterator.
 

n°2022408
pharaon200​5
Par Osiris et par Apis
Posté le 11-09-2010 à 12:00:20  profilanswer
 

Sinon je persiste, concurentModificationException est liée à la notion de thread même si on peut la lever en monothread.

 
Citation :

public class ConcurrentModificationException
extends RuntimeException

 

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

 

For example, it is not generally permssible for one thread to modify a Collection while another thread is iterating over it.
...


Message cité 1 fois
Message édité par pharaon2005 le 11-09-2010 à 12:00:51
n°2022467
Riokmij
Blink and you're dead
Posté le 12-09-2010 à 13:29:05  profilanswer
 

pharaon2005 a écrit :


Que ce soit une liste chainée (LinkedList) ou une liste indexée (ArrayList), on a la possibilité d'itérer dessus via un for sans se soucier du type de list.


 
Oui, mais les performances ne seront pas forcément équivalentes. Niveau perf, pour une ArrayList, ça revient au même d'utiliser un Iterator ou de faire des get(index) dans une boucle for, mais pour une LinkedList, l'iterator sera beaucoup plus efficace.
 
C'est tout l'intérêt de ce niveau d'abstraction supplémentaire : on n'a pas besoin de connaitre les détails de l'implémentation de la liste pour la parcourir de façon optimale.

n°2022486
pharaon200​5
Par Osiris et par Apis
Posté le 12-09-2010 à 16:09:04  profilanswer
 

Riokmij a écrit :

 

Oui, mais les performances ne seront pas forcément équivalentes. Niveau perf, pour une ArrayList, ça revient au même d'utiliser un Iterator ou de faire des get(index) dans une boucle for, mais pour une LinkedList, l'iterator sera beaucoup plus efficace.

 

C'est tout l'intérêt de ce niveau d'abstraction supplémentaire : on n'a pas besoin de connaitre les détails de l'implémentation de la liste pour la parcourir de façon optimale.

 

Faux.

 
Citation :

In practice, is it as efficient to traverse a LinkedList using a for-each loop as it is to use an iterator?
...
It's equvalent to using an Iterator. One difference would be not being able to remove items with for-each

 

http://www.dreamincode.net/forums/ [...] rformance/

Message cité 1 fois
Message édité par pharaon2005 le 12-09-2010 à 16:09:53
mood
Publicité
Posté le 12-09-2010 à 16:09:04  profilanswer
 

n°2022499
masklinn
í dag viðrar vel til loftárása
Posté le 12-09-2010 à 18:23:39  profilanswer
 

pharaon2005 a écrit :

Sinon je persiste, concurentModificationException est liée à la notion de thread


Non. C'est pas parce qu'ils donnent un exemple parlant de threads que c'est lié à la notion de threads. C'est juste que tu as plus de chance de te bouffer une CME quand tu sais pas ce que tes threads foutent, ce qui est probablement le cas.

pharaon2005 a écrit :

 

Faux.

 
Citation :

In practice, is it as efficient to traverse a LinkedList using a for-each loop as it is to use an iterator?
...
It's equvalent to using an Iterator. One difference would be not being able to remove items with for-each

 

http://www.dreamincode.net/forums/ [...] rformance/


C'est marrant, parce que mon JDK a pas du tout l'air d'accord [:dawa]

 

Sur une liste de 100000 éléments, ce code:

Code :
  1. for(int j=0; j<lst.size(); ++j) {
  2.    doStuff(lst.get(j));
  3. }


prend ~20s sur un i5 2.4GHz (test effectué 5 fois de suite, doStuff ne fait qu'incrémenter un compteur)

 

Alors que ce code:

Code :
  1. for (Integer aLst : lst) {
  2.    doStuff(aLst);
  3. }


prend 17ms la première fois qu'il tourne et moins d'une milliseconde le reste du temps (5 tests de suite, pareil qu'au dessus) (timings à la va-vite via System.currentTimeMillis, mais ça explique pas d'avoir 5 ordres de grandeur de différence)

 

Je t'encourage à faire le test toi même si tu ne me crois pas [:dawa]

 

[:sardine a l'huile]

 

Mais si tu savais de quoi tu parlais, tu aurais vite réalisé que ce que tu as cité n'avait aucun sens: l'indexation d'une LinkedList se fait en O(n), donc à chaque fois que tu fais un lst.get(i) il faut traverser toute la liste élément par élément jusqu'à trouver le bon...

Message cité 1 fois
Message édité par masklinn le 12-09-2010 à 18:24:42

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2022503
pharaon200​5
Par Osiris et par Apis
Posté le 12-09-2010 à 19:23:27  profilanswer
 

masklinn a écrit :


Non. C'est pas parce qu'ils donnent un exemple parlant de threads que c'est lié à la notion de threads. C'est juste que tu as plus de chance de te bouffer une CME quand tu sais pas ce que tes threads foutent, ce qui est probablement le cas.

 

Désolé, l'accès concurrent est principalement lié aux thread.

 
masklinn a écrit :


C'est marrant, parce que mon JDK a pas du tout l'air d'accord [:dawa]

 

Sur une liste de 100000 éléments, ce code:

Code :
  1. for(int j=0; j<lst.size(); ++j) {
  2.    doStuff(lst.get(j));
  3. }


prend ~20s sur un i5 2.4GHz (test effectué 5 fois de suite, doStuff ne fait qu'incrémenter un compteur)

 

Alors que ce code:

Code :
  1. for (Integer aLst : lst) {
  2.    doStuff(aLst);
  3. }


prend 17ms la première fois qu'il tourne et moins d'une milliseconde le reste du temps (5 tests de suite, pareil qu'au dessus) (timings à la va-vite via System.currentTimeMillis, mais ça explique pas d'avoir 5 ordres de grandeur de différence)

 

Je t'encourage à faire le test toi même si tu ne me crois pas [:dawa]

 

[:sardine a l'huile]

 

Mais si tu savais de quoi tu parlais, tu aurais vite réalisé que ce que tu as cité n'avait aucun sens: l'indexation d'une LinkedList se fait en O(n), donc à chaque fois que tu fais un lst.get(i) il faut traverser toute la liste élément par élément jusqu'à trouver le bon...

 

Tu me fais bien rigoler. On parle de comparer un iterator avec une boucle for, toi tu compares la boucle for avec la boucle for-each.
Bon j'ai fait le test. 15 ms pour l'iterator et 15 ms pour le for-each et 48750 ms pour un for (10 000 de integer).

 

Conclusion : le for-each et l'iterator sont équivalents pour toutes les Collection, le for classique est beaucoup plus long avec une LinkedList et pas utilisable avec les Set.

 

Message cité 4 fois
Message édité par pharaon2005 le 12-09-2010 à 19:47:06
n°2022510
kadreg
profil: Utilisateur
Posté le 12-09-2010 à 20:13:07  profilanswer
 

pharaon2005 a écrit :


Conclusion : le for-each et l'iterator sont équivalents pour toutes les Collection


 
bah et pour cause, c'est la même chose [:roane] foreach est juste un sucre syntaxique [:pingouino]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°2022513
Riokmij
Blink and you're dead
Posté le 12-09-2010 à 20:14:47  profilanswer
 

pharaon2005 a écrit :

 

Désolé, l'accès concurrent est principalement lié aux thread.

 


 

Non. Il y a des tas de cas où on peut avoir des accès à la collection sous-jacente sans avoir besoin de threads. En tout cas, toutes les fois où j'ai rencontré ce genre de problèmes, ce n'était jamais lié aux threads.

 
pharaon2005 a écrit :

 

Tu me fais bien rigoler. On parle de comparer un iterator avec une boucle for, toi tu compares la boucle for avec la boucle for-each.
Bon j'ai fait le test. 15 ms pour l'iterator et 15 ms pour le for-each et 48750 ms pour un for (10 000 de integer).

 

Tu sais comment est implémentée la boucle foreach pour les collections ? Bingo, c'est un Iterator !

 

Ce code :

Code :
  1. for (Integer i : list) {
  2. doStuff();
  3. }
 

est exactement équivalent à :

 
Code :
  1. Iterator<Integer> iter = list.iterator();
  2. while (iter.hasNext) {
  3.   Integer i = iter.next();
  4.   doStuff();
  5. }
 

Le foreach, c'est juste du sucre syntaxique.

 

EDIT : grillé :(


Message édité par Riokmij le 12-09-2010 à 20:19:03
n°2022519
phnatomass
Je m'empare de ton esprit !!
Posté le 12-09-2010 à 20:25:41  profilanswer
 

kadreg a écrit :


 
bah et pour cause, c'est la même chose [:roane] foreach est juste un sucre syntaxique [:pingouino]


+1
Le Pharaon ne sait pas faire la différence entre un foreach et une boucle for( ; ; )


Message édité par phnatomass le 12-09-2010 à 20:26:23
n°2022520
pharaon200​5
Par Osiris et par Apis
Posté le 12-09-2010 à 20:34:45  profilanswer
 


:sleep:  
Bon on est d'accord la-dessus ?

Citation :

Conclusion : le for-each et l'iterator sont équivalents pour toutes les Collection, le for classique est beaucoup plus long avec une LinkedList et pas utilisable avec les Set.


 
Le topic est clos.

n°2022559
masklinn
í dag viðrar vel til loftárása
Posté le 13-09-2010 à 05:01:59  profilanswer
 

pharaon2005 a écrit :

Désolé, l'accès concurrent est principalement lié aux thread.


T'as encore rien compris au film toi [:dawa]

pharaon2005 a écrit :


Tu me fais bien rigoler. On parle de comparer un iterator avec une boucle for, toi tu compares la boucle for avec la boucle for-each.
[…]
 
Conclusion : le for-each et l'iterator sont équivalents pour toutes les Collection, le for classique est beaucoup plus long avec une LinkedList et pas utilisable avec les Set.


[:rofl]
 
Continues à creuser, tu vas bientôt découvrir que la terre n'est pas plate avec un peu de bol. [:dawa]

pharaon2005 a écrit :

:sleep:  
Bon on est d'accord la-dessus ?


Non mais s'tu veux c'est dans la définition du foreach Java, faut être toi pour pas être au courant [:dawa]

Message cité 1 fois
Message édité par masklinn le 13-09-2010 à 05:04:19

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2022606
pharaon200​5
Par Osiris et par Apis
Posté le 13-09-2010 à 11:36:31  profilanswer
 

masklinn a écrit :


T'as encore rien compris au film toi [:dawa]


 

masklinn a écrit :


[:rofl]
 
Continues à creuser, tu vas bientôt découvrir que la terre n'est pas plate avec un peu de bol. [:dawa]


 

masklinn a écrit :


Non mais s'tu veux c'est dans la définition du foreach Java, faut être toi pour pas être au courant [:dawa]


 
Ouai désolé je suis pas [:orazur]
Les débats de [:zoukoufxxx:3] ca peut tourner en rond pendant longtemps.
Bref, on va arrêter là y a plus rien de constructif [:justhynbrydhou:5]
 

n°2022618
masklinn
í dag viðrar vel til loftárása
Posté le 13-09-2010 à 12:00:42  profilanswer
 

pharaon2005 a écrit :

Ouai désolé je suis pas [:orazur]
Les débats de [:zoukoufxxx:3] ca peut tourner en rond pendant longtemps.


Non mais ya jamais eu de débat en fait, ya juste eu les autres (qui ont la réalité de leur côté) et toi (qui se vautre comme une grosse otarie bourrée) [:dawa]

pharaon2005 a écrit :

Bref, on va arrêter là y a plus rien de constructif [:justhynbrydhou:5]


Oh ben zute alors, c'est sûr que tu faisais avancer la connaissance humaine avec des débarquements tels que

pharaon2005 a écrit :

Tu me fais bien rigoler. On parle de comparer un iterator avec une boucle for, toi tu compares la boucle for avec la boucle for-each.
Bon j'ai fait le test. 15 ms pour l'iterator et 15 ms pour le for-each et 48750 ms pour un for (10 000 de integer).
 
Conclusion : le for-each et l'iterator sont équivalents pour toutes les Collection, le for classique est beaucoup plus long avec une LinkedList et pas utilisable avec les Set.


[:dawa]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2022671
hydrogene
Posté le 13-09-2010 à 16:02:42  profilanswer
 

masklinn a écrit :


Non mais ya jamais eu de débat en fait, ya juste eu les autres (qui ont la réalité de leur côté) et toi (qui se vautre comme une grosse otarie bourrée) [:dawa]


 

masklinn a écrit :


Oh ben zute alors, c'est sûr que tu faisais avancer la connaissance humaine avec des débarquements tels que


 


 
Mais oui c'est bien mon gros [:zorro561]
Allez ... [:pika-pika]

n°2022760
masklinn
í dag viðrar vel til loftárása
Posté le 14-09-2010 à 06:37:33  profilanswer
 

hydrogene a écrit :


 
Mais oui c'est bien mon gros [:zorro561]
Allez ... [:pika-pika]


Et des multis pourris en bonus, tu t'es fait cracotter [:opus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2029911
mcrak
1er, 2ème & 3eme top player.
Posté le 17-10-2010 à 11:39:04  profilanswer
 

C'est pareil.
A la compilation la boucle "for each" est interprétée comme un objet implémentant la classe iterable.
La notation a été introduite dans java 5 pour faciliter la lecture.


---------------
Se Queda.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Pourquoi utiliser un iterator au lieu d'un for ? [résolu]

 

Sujets relatifs
[Oracle10] Utiliser datapump avec une liste de tables(Php) Utiliser les cookies de curl dans le navigateur
coller des div sans utiliser le placement cssadapter une date pour pouvoir l'utiliser dans un requête
[R/Java/C++] Utiliser le moteur de rendu graphique R dans une appliUtiliser un iterator sur un vector à 2 dimensions - position
[RESOLU] mysql_query("UPDATE ce met à jour mais remplace au lieu...Quand utiliser le srand ?
Utiliser libcurl avec CodeBlocks 
Plus de sujets relatifs à : Pourquoi utiliser un iterator au lieu d'un for ? [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR