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 :

Comparaison et création ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut Comparaison et création ArrayList
    Bonjour,

    Je cherche à comparer 2 ArrayList afin de créer une 3ème ArrayList qui contiendra les lignes qu'elles ont en commun.
    J'ai penser à une fonction de ce type mais je ne suis pas persuader de ce que je fait.
    Quelqu'un a déjà été confronté à ce pb? je ne pense pas que parcourir manuellement les listes soit le plus performant mais je ne sais pas comment procéder autrement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<PersonnePP> compareListPP(List<PersonnePP> List1, List<PersonnePP> List2) {
    	//Storing the comparison output in ArrayList<PersonnePP>
    	ArrayList<PersonnePP> List3= new ArrayList<PersonnePP>();
    	for (PersonnePP temp : List1)
    	List3.add(List2.contains(temp) ? temp);
    }
    Cordialement

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Si tes éléments sont "uniques" dans les listes alors il s'agit plutôt d'ensemble (Set).

    Et dans ce cas, tu peux utiliser retainAll

  3. #3
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    Justement, je ne suis pas persuader qu'ils soit "uniques", là est tous le problème

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Trois questions :
    1. Que cherches-tu à faire in fine ?
    2. Quel comportement souhaites-tu avoir dans le cas de doublons ? Une seule fois, autant de fois en commun, tout cumulé
    3. L'ordre des éléments est-il important ? Si oui, faut-il conserver l'ordre de la première ou celle de la seconde ?

  5. #5
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    Exemple :

    List1 : Xavier, Francois, Patrick, Patrick
    List2 : Patrick, Francois, Paul, Michel

    List3 (Résultat) : Patrick, Francois

    Je souhaite éviter les doublons en effet, l'ordre n'a pas d'importance.

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Construis un Set avec la première liste, puis utilises retainAll() avec la seconde.

  7. #7
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    Ok je vais essayer ça, merci

  8. #8
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Et n'oublie pas d'étendre les méthodes equals et hashCode dans tes classes PersonnePP, parce que sinon tu risques d'avoir du mal à avoir un fonctionnement cohérent avec le HashSet
    http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Une autre solution utilisant les Streams de Java 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        List<String> list1 = Arrays.asList("Xavier", "Francois", "Patrick", "Patrick");
        List<String> list2 = Arrays.asList("Patrick", "Francois", "Paul", "Michel");
     
        List<String> result = list1.stream()
            .filter(list2::contains)        // On n'accepte que les éléments contenu dans la list2
            .distinct()                     // On supprime les doublons
            .collect(Collectors.toList());  // Et on stocke le résultat dans une liste
     
        System.out.println(result); // [Francois, Patrick]

    a++

  10. #10
    Membre régulier Avatar de Cvanhove
    Homme Profil pro
    Concepteur Développeur Informatique
    Inscrit en
    Septembre 2014
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur Développeur Informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 174
    Points : 70
    Points
    70
    Par défaut
    Je fais remonter la discussion car je reviens sur ce problème (j’étais sur autre chose).
    Je ne comprend pas comment manipuler un objet HashSet :/
    Du coup j'ai trouver un morceau de code qui semble presque faire ce que je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //ON enleve de a tous les elements présent dans b
    a.removeAll(b);
    //On enleve ensuite de b tous les elements dans a => temp car a a été modifié;
    b.removeAll(temp);
     
    //Ensuite on a que les differences dans a et b. IL suffit de prendre a et de rajouter tous les enregistrements de b;
    a.addAll(b);
    Sauf que au lieu de garder les différences comme ci dessus, je veux garder les similitudes, une idée?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,
    Citation Envoyé par Cvanhove Voir le message
    Sauf que au lieu de garder les différences comme ci dessus, je veux garder les similitudes, une idée?
    retainAll() ?

    Citation Envoyé par Cvanhove Voir le message
    Je ne comprend pas comment manipuler un objet HashSet :/
    Un HashSet indexe les éléments qu'on y met par leur hashcode (qui permet de faire un arbre de hashage, qui permet de retrouver plus rapidement une valeur qui s'y trouve (je passe sur le détail) : l'important donc, c'est d'implémenter hashCode() mais aussi equals() (voir leur documentation), et que ces éléments soient immutables. Le HashSet garantit que parmi n valeurs égales (au sens qu'elle vérifie equals()), donc de même hashCode, une seule sera conservée dans le set.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set<Integer> set = new HashSet<>();
    // j'ajoute 10 fois 42 dans mon hashSet
    for(int i=0; i<10; i++) {
       set.add(42);
    }
    System.out.println(set.size() + " - " + set);
    Ce code affiche :
    1 - { 42 }

Discussions similaires

  1. Comparaison entre deux ArrayList
    Par mouned dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/01/2015, 12h56
  2. comparaison de 2 arraylist<Integer>
    Par livinho38 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 20/05/2010, 14h57
  3. Comparaison de 2 ArrayList
    Par ramanov dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 05/05/2008, 14h47
  4. Comparaison avec un ArrayList
    Par zonez dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 31/05/2007, 17h39
  5. Comparaison des éléments d'une ArrayList
    Par Emilie MARQUOIS-OGEZ dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 31/10/2006, 15h17

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