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

Langage Java Discussion :

Problème avec méthodes instanceof() et remove()


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème avec méthodes instanceof() et remove()
    Bonjour !

    Je suis étudiant (pas en informatique), je bosse sur un projet et je suis face à un problème que j'arrive pas à résoudre.

    Voilà, je testait mon code qui met notamment en jeu des méthodes de ce type :
    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
     public static ArrayList<Ouvrage> garderRomans(ArrayList<Ouvrage> listouvr){
     
            for (int i = 0; i < listouvr.size(); i++) {
                    if (listouvr.get(i) instanceof DVD){
                     DVD dvd = (DVD)listouvr.get(i);    
                     listouvr.remove(dvd);
                } 
                    if (listouvr.get(i) instanceof CD){
                    CD cd = (CD)listouvr.get(i);     
                    listouvr.remove(cd);
                    }               
                }           
     
            return listouvr;
        }
    Et en remarquant des problèmes dans mon code, j'ai fait les tests suivants pour essayer de mieux comprendre ce qu'il se passe (en vain ^^):
    La je teste si un élément d'une liste d'ouvrage (dont Roman, CD et DVD sont des sous-classes) est un DVD, et l'affiche si oui. Jusque là tout va bien :
    Nom : PBjava2.jpg
Affichages : 359
Taille : 140,2 Ko

    Puis je teste si un élément de cette liste est un DVD, et l'enlève de cette liste si oui. Ensuite j'affiche la liste. Je m'attends donc à ce que la liste contienne tous les ouvrages présents précédemment, sans les DVDs. Or ce n'est pas le cas.
    Nom : Pbjava1.jpg
Affichages : 368
Taille : 233,7 Ko

    Voilà, j'attend votre aide !

    PS : Je tiens à préciser que je code depuis très peu de temps, et ce n'est que mon deuxième vrai "projet" depuis. J'ai donc des connaissances du langage et de la pensée informatique limitées.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quand tu supprime une élément, le reste des éléments de ta liste, qui étaient derrière, bougent pour combler le trou. Si tu retire l'élément en position 4 par exemple, l'élément qui étaient en position 5 bouge en 4. Celui qui était en 6 bouge en 5. Etc.
    Ta boucle, elle fait 1 2 3 4 5 ... Donc elle suppose que les éléments ne changent pas de place.


    Pour parcourir une liste en supprimant des élément, on peut utiliser un iterator, avec ses méthodes next() et remove(). Si tu utilise java 8, tu peux préférer créer une nouvelle liste avec stream().filter() ou tu peux utiliser la méthode removeIf() qui fait déjà le boulot de supprimer les éléments correspondant à un critère. Au passage, si le but est de garder tous les romans, teste que c'est un roman pas que ce n'est ni un DVD ni un CD. Si demain tu ajoute des cassettes tu ve devoir revoir ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listouvr.removeIf(ouvrage -> !(ouvrage instanceof Roman));

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, j'ai pu régler mes soucis, et simplifier mon code par la même occasion ! Au passage j'ai une nouvelle question :

    lorsque j'affecte à une ArrayList A nouvellement créée une ArrayList déjà existante B (étant dans ce cas un attribut d'une classe), je remarque que les deux se retrouvent liées. En effet, lorsque je retire un élément de A, celui ci est aussi retiré de B, (ce qui ne me paraît pas normal, car si on fait le même type de raisonnement avec des entiers tout colle) Code :

    Nom : pbjava3.jpg
Affichages : 221
Taille : 250,6 Ko

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Finalement j'ai réussi à réglé mon problème (ArrayList <> A = new ArrayList (B))

Discussions similaires

  1. [C#] Probléme avec Méthode Static
    Par WebTeamMtl dans le forum C#
    Réponses: 4
    Dernier message: 07/11/2008, 22h27
  2. Problème avec méthode UpdateCommand
    Par Nixar dans le forum C#
    Réponses: 1
    Dernier message: 22/07/2008, 22h54
  3. Problème avec méthode unload
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/05/2008, 10h45
  4. Problème avec méthode AddFromString
    Par Farbin dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/02/2008, 18h21
  5. Problème avec méthode "cloneNode()"
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/10/2006, 14h14

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