IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Problème de parcours de tableau bluffant


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut Problème de parcours de tableau bluffant
    Vous allez peut-être me prendre pour un fou furieux, mais lorsque je fais un parcours total de mon tableau (voici le code associé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public void supprimeMotNonImbrique()
        {
            /**grâce à cette méthode (après traitement de supprimeMotDejaExistant()),
             * on supprime les mots dans listeTemporaire qui ne sont pas imbriqués
             * c'est à dire que lors de la génération (lorsque l'on génère le tableau listeImbrication ,voir 
             * CliqueTemporaire)on ne retrouve pas tous les mots dans listeMot.
             * (deuxième filtre)
             */
            System.out.println(this.listeTemporaireMot.size());
            for (int i=0;i<this.listeTemporaireMot.size();i++)
            {
                this.clique=new CliqueTemporaire(this.listeTemporaireMot.get(i));
                this.clique.generationTableauTemporaire();
                if (!this.clique.verificationImbrication())
                {
                    this.listeTemporaireMot.remove(i);
                }
                System.out.print(i);
            }
            this.generationChaqueMot();
        }
    Lorsque je veux afficher la size il me rend 64 (ce qui est tout à fait exact). Mais quand je rentre dans le for (quand j'affiche i il m'affiche de 0-31 c'est à dire exactement la moitié de mon tableau). Je signale au passage que mon tableau est de type ArrayList. Bref alors que je devrais parcourir entièrement mon tableau (0-63), je ne parcours que la moitié.
    Dommage je peux pas intégrer d'image de mon ordi.
    Y a-t-il quelque chose que je ne fais pas? (je n'ai aucune erreur signalé par eclipse)

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu supprimes des objets de ta liste, pas étonnant que tu n'ailles pas au bout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.listeTemporaireMot.remove(i);

  3. #3
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Et alors je vois pas le problème. Quelque soit les opérations que l'on fasse sur un ArrayList (si on fait un parcours total) on doit aller jusqu'au bout même si l'on supprime des mots (dans mon cas).

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Si tu passes par l'indice, non. La façon propre de le faire serait avec un iterateur, ou bien avec un foreach en construisant une liste d'objets à retirer à la fin.

    Imagine une liste de 2 éléments.
    i = 0 => Tu testes le 1er élément. Pas bon, tu le retires. La taille de ta liste est maintenant 1.
    i = 1. Tu sors de ton for.
    Moralité tu n'as pas testé ton 2ème élément.

  5. #5
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Ok je vois pourquoi maintenant il ne fait que la moitié. Pour le foreach j'ai déjà essayé il me fait une erreur de commodification. En gros il ne veut pas que je modifie pour chaque mot. A moins que maintenant ça soit possible. Il faudrait que j'essaie. Bon j'ai essayé j'avais raison:
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    Conclusion comment supprimer toute la liste et non pas la moitié en ayant un remove?

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Pour le foreach comme je l'ai dit, si tu veux l'utiliser il faut construire la liste des objets à retirer, et les retirer tout à la fin.

    Sinon, utiliser un itérateur.

    Enfin, il y a la possibilité de faire i-- quand tu retires un objet.

  7. #7
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Je ne peux pas me permettre de construire une liste d'objet à retirer (mon algo doit être rapide). Je n'ai pas compris ce que tu voulais dire par i--.
    C'est à dire au lieu de faire i++ je le remplace par i-- (mais ça revient à la même chose) ou alors le faire avec un tant que, ça pourrait fonctionner??

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (int i=0;i<this.listeTemporaireMot.size();i++)
            {
                this.clique=new CliqueTemporaire(this.listeTemporaireMot.get(i));
                this.clique.generationTableauTemporaire();
                if (!this.clique.verificationImbrication())
                {
                    this.listeTemporaireMot.remove(i);
                    i--;
                }
                System.out.print(i);
            }

  9. #9
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Désolé erreur java.lang.NullPointerException. Juste un truc, c'est sensé faire quoi le i--?(décrémenté ça je sais mais encore...). J'ai essayé i=i-- c'est pas mieux.

  10. #10
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Ceci est bien meilleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int i=1;
            while (i<this.listeTemporaireMot.size())
            {
                i--;
                this.clique=new CliqueTemporaire(this.listeTemporaireMot.get(i));
                this.clique.generationTableauTemporaire();
                if (!this.clique.verificationImbrication())
                {
                    this.listeTemporaireMot.remove(i);
                    //System.out.print(i);
                }
                i++;
            }
    Il ne reste plus qu'un seul mot courage!!!En plus pas d'erreur.
    Problème comment enlever le dernier mot restant?

  11. #11
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par lodacom Voir le message
    Désolé erreur java.lang.NullPointerException. Juste un truc, c'est sensé faire quoi le i--?(décrémenté ça je sais mais encore...). J'ai essayé i=i-- c'est pas mieux.
    Oui ça décrémente, ce qui est logique : si tu es dans une liste, que tu retires l'élément courant, l'élément suivant est maintenant en fait à la place de l'élément courant. Donc tu retires 1 à ton index pour éviter que de sauter un élément.
    Ta NullPointerException, elle est déclenchée par quel appel ?

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le parcours par index est toujours casse-gueule... et il est préférable de l'éviter au profit de la boucle foreach ou directement de l'Iterator (si on a besoin de la suppression) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	Iterator<LeTypeDeTaListe> = this.listeTemporaireMot.iterator();
    	while (iterator.hasNext()) {
    		CliqueTemporaire tmp = new CliqueTemporaire(this.listeTemporaireMot.get(i));
    		tmp.generationTableauTemporaire();
    		if (!tmp.verificationImbrication()) {
    			iterator.remove();
    		}
    	}
    a++

    PS : Pourquoi tu utilises une variables d'instance (this.clique) pour les variables temporaires de ta boucle. C'est complètement inutile et source de problème potentiel...

  13. #13
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Sinon, si tu souhaites toujours conserver le parcours par "get()", il te suffit de parcourir ta liste à l'envers : de la fin vers le début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public void supprimeMotNonImbrique()
    {
      System.out.println(this.listeTemporaireMot.size());
      for( int i = this.listeTemporaireMot.size() - 1 ; i >= 0 ; --i )
      {
        this.clique=new CliqueTemporaire(this.listeTemporaireMot.get(i));
        this.clique.generationTableauTemporaire();
        if (!this.clique.verificationImbrication())
        {
          this.listeTemporaireMot.remove(i);
        }
        System.out.print(i);
      }
      this.generationChaqueMot();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  14. #14
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Merci de tes conseils adiGuba. Comme j'ai dis plus haut la boucle foreach crée une erreur de commodification. La solution de l'Iterator était plutôt pas mal. Le problème c'est lorsque je veux réutiliser l'Iterator, impossible de le réutiliser. Or je veux faire plusieurs suppressions en plusieurs fois (filtre de mot). Merci pour le conseil que tu m'as donné à propos du PS que tu m'as mis.
    Autre chose quand je veux afficher les mots de l'Iterator grâce à next() (après suppression éventuels de mots).Une boucle infinie se déclenche (d'où mon problème de réutilisation de l'Iterator)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    this.parcours= this.listeTemporaireMot.iterator();
            while (this.parcours.hasNext())
            {
                if (!motATraiter(this.parcours.next()))
                {
                    this.parcours.remove();
                }
            }
            this.afficheIterator();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void afficheIterator()
        {
            while (this.parcours.hasNext())
            {
                System.out.println(this.parcours.next());
            }
        }

  15. #15
    Membre confirmé
    Homme Profil pro
    PHP + JAVA
    Inscrit en
    Mars 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : PHP + JAVA

    Informations forums :
    Inscription : Mars 2009
    Messages : 65
    Par défaut
    Ayez j'ai trouvé la soluce!!!
    Pour que l'Iterator soit réutilisable il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.parcours= this.listeTemporaireMot.iterator();
    En théorie l'Iterator est mis à jour (la listeTemporaireMot aussi puisqu'elle a subit la suppression voir doc Java croisons les doigts
    Returns an iterator over the elements in this list in proper sequence. This implementation returns a straightforward implementation of the iterator interface, relying on the backing list's size(), get(int), and remove(int) methods.
    )
    Bon ben je crois que je peux mettre le post en résolu Merci à tous pour votre aide.

  16. #16
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lodacom Voir le message
    Merci pour le conseil que tu m'as donné à propos du PS que tu m'as mis.
    Pourtant tu ne l'a pas pris en compte : pourquoi as-tu déclaré ton Iterator en variable d'instance ! C'est vraiment le cas le plus typique de variable locale qui n'a rien à faire en attribut d'instance...

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WB18] Problème de parcours de tableau à plusieurs dimensions de chaîne
    Par fabian_RemLab dans le forum WebDev
    Réponses: 0
    Dernier message: 14/06/2015, 00h46
  2. Problème de taille de tableau
    Par k-nine dans le forum C
    Réponses: 6
    Dernier message: 25/09/2005, 09h16
  3. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30
  4. problème d'affectation de tableau ...
    Par Mike888 dans le forum C
    Réponses: 23
    Dernier message: 26/02/2005, 14h52
  5. [Debutant(e)]Pb parcours de tableau
    Par joquetino dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 22/09/2004, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo