Iterator
Résolu
k-23
Messages postés
252
Date d'inscription
Statut
Membre
Dernière intervention
-
ayago Messages postés 28 Date d'inscription Statut Membre Dernière intervention -
ayago Messages postés 28 Date d'inscription Statut Membre Dernière intervention -
2 réponses
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,
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.
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,
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
}
}
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,
est ce que cela modifie ma collection.
merci