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
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
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
20 févr. 2009 à 19:06
Bonsoir,
Ce n'est pas étonnant, il faut faire de la manière suivante :
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,
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,
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
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.
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.
20 févr. 2009 à 19:10
20 févr. 2009 à 19:12
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,
20 févr. 2009 à 19:21
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
}
}
20 févr. 2009 à 19:42
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,
20 févr. 2009 à 19:51
est ce que cela modifie ma collection.
merci