Iterator

Résolu/Fermé
k-23 Messages postés 252 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 25 novembre 2014 - 20 févr. 2009 à 18:45
ayago Messages postés 28 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 12 octobre 2011 - 12 oct. 2011 à 07:05
Bonjour,

j'ai un problème lorsque j'utilise un iterator. la methode hasNext(); marche tres bien mais quand j'utilise next(); ca marche pas du tout. en fait ca compile mais lorsque je le test il plante dans le next();

private ArrayList <T> liste1;

private Iterator <T> ite;

public ListeImpl(){

liste1 = new ArrayList<T>();

ite = liste1.iterator();
}

public T prochainElement() {

if(ite.hasNext()){

System.out.println(ite.next());

return ite.next();//// CEST ICI QUE CA PLANTE CA COMPILE MAIS CA MARCHE PLUS ICI quand je test
}

return null;
}

merci pour laide

2 réponses

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
20 févr. 2009 à 19:06
Bonsoir,
Ce n'est pas étonnant, il faut faire de la manière suivante :
private ArrayList<T> liste1;
private Iterator<T> ite;

public ListeImpl(){
 liste1 = new ArrayList<T>();
 ite = liste1.iterator();
}

public T prochainElement() {
 T elmt = null;
 if(ite.hasNext()) {
  elmt = ite.next()
  System.out.println(elmt);
 }
 return elmt;
} 


Le fait est que quand tu fais appel à la méthode next(), celà déplace l'itérateur sur l'élément suivant. Donc quand tu fais ite.hasNext() (ta liste a encore au moins un élément), System.out.println(ite.next()) puis return ite.next(); tu peux avoir un problème (car tu fais deux next, donc si ta liste ne contient plus qu'un seul élément ça va planter).

Cordialement,
4
k-23 Messages postés 252 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 25 novembre 2014 9
20 févr. 2009 à 19:10
j'ai essayé ca mais ca marche pas
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
20 févr. 2009 à 19:12
Qu'est ce que ça fait quand tu dis "ça ne marche pas" ?
Tu as une exception, ça n'affiche rien, ça fait quoi ?

Es-tu sûr d'utiliser une liste non vide ?

Si tu as une exception, n'hésite pas à donner la StackTrace qu'on puisse découvrir d'où ça vient.

Cordialement,
0
k-23 Messages postés 252 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 25 novembre 2014 9
20 févr. 2009 à 19:21
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at ca.uqam.inf2120.tp1.ListeImpl.prochainElement(ListeImpl.java:141)
at ca.uqam.inf2120.tp1.prueva.main(prueva.java:34)

cest ca plante quand il rencontre le next();

dans mon main j'ajoute deux elements et je suis sur qu'il existe pcq jai verifier toutes mes methodes marches mais pas celle-ci. j'ai utiliser dans une des mes methodes le hasNext(); pour savoir s'il a un elementprochain mais cest tout j,ai pas utiliser de next();

c,est bizarre pcq je lavais deja utiliser avant dans un autre travail et ca marcher très bien le next() cest juste ici que ca me fais chier.

VOICI MON MAIN

public static void main (String [] args){

ListeAdt<String> uneListe = new ListeImpl<String>();
ListeAdt<String> uneAutreListe = new ListeImpl<String>();
//Iterator sd = uneListe.iterator();
System.out.println("ajoute dun liste");
System.out.println("ajoute dun liste");


uneListe.ajouterDebut("A");
System.out.println("1");
System.out.println("la taille est : "+uneListe.taille());

uneListe.ajouterDebut("B");
System.out.println("2");
System.out.println("la taille est : "+uneListe.taille());
System.out.println(uneListe.existeElement("A"));
System.out.println(uneListe.existeElement("B"));
System.out.println(uneListe.taille());



System.out.println(uneListe.prochainElement()); // CEST ICI



}
}
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
20 févr. 2009 à 19:42
C'est normal que tu aies cette exception, car tu n'utilises pas l'iterateur comme il faut.
L'itérateur est un design pattern qui te permet de parcourir une collection afin d'appliquer un traitement sur chaque élément de la collection.
Tu n'es pas sensé modifier ta collection pendant que tu la parcoures. En général ton exception est levée dans des applications multi-threadées (https://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html ) car un thread essaie de modifier la collection pendant qu'un autre fait une itération.

Cordialement,
0
k-23 Messages postés 252 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 25 novembre 2014 9
20 févr. 2009 à 19:51
mais je pas modifier ma collection je veux juste qu'il return next();

est ce que cela modifie ma collection.

merci
0
ayago Messages postés 28 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 12 octobre 2011 2
12 oct. 2011 à 07:05
voici la solution que j ai pu trouver grâce a vos éclaircissement, si vous voyez une façon plus optimiser pour faire bienvenue a toute autres suggestions
Code Java :

public class ListeAdtArraylistImpl<T> implements ListeAdt<T> {

private ArrayList<T> listeAdt;
private Iterator<T> iterateur;

public ListeAdtArraylistImpl() {
listeAdt = new ArrayList<T>();
iterateur = listeAdt.iterator();
}

public T[] ajouter(ListeAdt<T> liste) {
ArrayList<T> listeElementNonAjoute = new ArrayList<T>();
ArrayList<T> listeElementAjoute = new ArrayList<T>();

for (T element : listeAdt) {
if (liste.estElements(element)) {
listeElementNonAjoute.add(element);
} else {
listeElementAjoute.add(element);
}
}
for (T t : listeElementAjoute) {
liste.ajouter(t);
}
return (T[]) listeElementNonAjoute.toArray();

}

Code Java :
public T prochainElement() {
return listeAdt.iterator().next();
}

je l'ai tester est ça marche, pour si quelqu'un trouveras un jour le même problème au moins ça va donner une piste.
2