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 :

[List][Map?] Comparaison de Lists


Sujet :

Collection et Stream Java

  1. #1
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut [List][Map?] Comparaison de Lists
    Bonjour,

    Mon problème est le suivant. Je voudrais savoir s'il n'y a pas une maniere plus élégante pour faire le code que vais vous montrer plus loin (je pensais passer par une Map ou un iterator, mais je ne sais pas trop comment m'y prendre).

    L'ennoncé :

    J'ai deux ArrayList<Competence>.

    Cette objet Competence contient un id<String>.

    Je veux que les competences contenu dans la premiere list soit effacées de la deuxieme.

    Voila ce que je fais :
    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
     
    //profilSelected est la première liste
    //competencesComplete est la deuxième liste
     
                for (int j=0; j< profilSelected.size(); j++) {
     
                    Competence compFromProfil= (Competence)profilSelected.get(j);
     
                    for (int i=0; i<competencesComplete.size(); i++) {
                        Competence compFromCompl= (Competence)competencesComplete.get(i);
                        if (compFromProfil.getCode().equals(compFromCompl.getCode())) {
                            competencesComplete.remove(i);
                            i--;
                        }
                    }
                }
    Des idées?

  2. #2
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Il me semble que ArrayList implement List, et que dans List , il y a une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    removeAll(Collection<e> c)
    Ainsi, tous les éléments contenu dans la collection c seront supprimés !
    L'explication de L'api doc :
    removeAll(Collection<?> c)
    Removes from this list all of its elements that are contained in the specified collection (optional operation).

  3. #3
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Bonjour Janitrix,

    Merci pour ta réponse, effectivement il me semblait bien qu'il manquait une donnée à mon probleme.

    Les deux liste contiennent bien des objets Competence mais ces objets ne sont pas strictement les même. Seule la propriete id de l'objet permet de les distinguer ("clé primaire" de la compétence).

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    je ne suis pas sur de ce que je vais dire mais ...

    si tu faisais implémenter Comparable par tes Objets Compétence et que dans la méthode compareTo que tu redéfinirais tu faisais la comparaison sur l'id, à mon avis le removeAll fonctionnerait comme tu le souhaites ...

  5. #5
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Autre remarque :
    J'ai deux ArrayList<Competence>.[...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Competence compFromProfil= (Competence)profilSelected.get(j);
    As tu vraiment besoin de faire le cast ? Il me semble que non si tu as bien fait ArrayList<Competence>.
    Sinon la remarque de in est intéressante, tu devrais la tester.
    Bonne chance en tout cas .

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par Janitrix
    Autre remarque :

    As tu vraiment besoin de faire le cast ? Il me semble que non si tu as bien fait ArrayList<Competence>.
    Sinon la remarque de in est intéressante, tu devrais la tester.
    Bonne chance en tout cas .
    et tu peux aussi utiliser la boucle for améliorée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Competence  c : profilSelected){
    ...
    }

  7. #7
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par yolepro
    Bonjour Janitrix,

    Merci pour ta réponse, effectivement il me semblait bien qu'il manquait une donnée à mon probleme.

    Les deux liste contiennent bien des objets Competence mais ces objets ne sont pas strictement les même. Seule la propriete id de l'objet permet de les distinguer ("clé primaire" de la compétence).
    La méthode removeAll(Collection) va utiliser la méthode contains(..) qui utilisera le equals(..)

    Si tu surcharges la méthode equals(...) dans ton objet Competence afin de retourner "true" lorsque l'id est le meme alors le tour est joué.
    Ensuite si ton objet est comparable, il est conseillé d'adapter la méthode compareTo afin d'être cohérent entre la méthode equals() et compareTo()

  8. #8
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Bonjour et merci a tout le monde pour vos réponses (que je n'ai d'ailleurs pas toutes comprises ).

    J'ai finalement choisi la solution très adapté de divxdede qui est de surcharger la methode equals.

    Cela fait exactement ce que je souhaite, super !!!

    J'ai du coup mis en place un system de Comparable suffisement efficace pour mon utilité.

    Cela donne donc cela :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class Competence implements Serializable {
     
    ... blablabla propriete...
     
        private String code = ""; // a la fin il y a bien sur les setter et getter
     
        private static Comparator comparator = null;
     
        static {
            comparator = new Comparator() {
                        public int compare(Object o1, Object o2) {
                            Competence ov1 = (Competence) o1;
                            Competence ov2 = (Competence) o2;
     
                            int ret = 0;
                            ret = (new Integer(ov1.getCode())).compareTo(new Integer(
                                        ov2.getCode()));
     
                            if (ret != 0) {
                                return ret;
                            }
     
                            return ret;
                        }
                    };
        }
     
        public static Comparator getComparatorOV() {
            return comparatorOV;
        }
     
        public boolean equals(Object o){
            return ((Competence)o).getCode().equals(this.getCode());
        }
     
    ... blablabla la suite ...
    }
    Du coup, je n'ai plus qu'à appeler maListe.removeAll(monAutreListe);

    Merci

  9. #9
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    il est de bon ton de toujours effectuer ces comparaisons et tests d'égalité suivant ce schéma:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int compare(Object o1, Object o2) {
                             if( o1 == o2 )  return 0;
                             else if( o1 == null ) return -1;
                             else if( o2 == null ) return 1;
     
                             // your business comparaison (o1 and o2 aren't null)
                             // ...
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public boolean equals(Object o){
              if( this == o ) return true;
              else if( o == null ) return false;
     
              // your business identity test (o isn't null)
              // ...
    Ca t'évitera des NullPointerException intempestifs !!!

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

Discussions similaires

  1. [AJAX] liste liée a une liste liée a une liste
    Par dirty_harry dans le forum AJAX
    Réponses: 2
    Dernier message: 03/07/2009, 11h18
  2. Comparaison de liste
    Par Bourdet dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2006, 09h50
  3. comparaison de listes chainee
    Par smalto dans le forum C
    Réponses: 5
    Dernier message: 22/09/2006, 18h10
  4. Réponses: 1
    Dernier message: 09/06/2006, 09h42
  5. Problem de Map et de List
    Par Roming22 dans le forum C++
    Réponses: 5
    Dernier message: 29/05/2006, 11h29

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