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

Développement Web en Java Discussion :

Problème d'algorithme : comment comparer les éléments de deux liste différentes ?


Sujet :

Développement Web en Java

  1. #1
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut Problème d'algorithme : comment comparer les éléments de deux liste différentes ?
    Bonjour,

    je suis en train de développer une application de gestion des horaires du personnel.
    Chaque fin de mois, on calcule, entre autre, le nombre d'heure travaillées, le nombre de congé pris, etc.... Ces éléments se trouve dans une table moisdisp.
    A partir de la liste du personnel, il faudrait comparer les personnes qui ont leurs moisdisp qui a été généré, et indiqué les personnes qui n'ont pas eu leur moisdisp de générer.
    Je ne sais pas si ce que j'ai dit est compréhensible.


    Ce bout de code me permet de connaitre le nombre de personne pour un service donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    listePersonnePasEnCdd = this.personneService.getPersonneDTOPasCDDByUniteId(this.getUniteSelected());
    		if(listePersonnePasEnCdd.size() > 0){
    			for(PersonneDTO personnePasEnCdd : listePersonnePasEnCdd){
    				PersonneDTO persDto = new PersonneDTO();
    				persDto.setIdPersonne(personnePasEnCdd.getIdPersonne());
    				persDto.setNom(personnePasEnCdd.getNom());
    				persDto.setPrenom(personnePasEnCdd.getPrenom());
     
    			}
     
    		}
    Ce bout de code me permet de récuper les moisdisp qui ont été généré
    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
     
    listPersonneCompteurSemaine = this.compteurService.getListCompteurbyIdUniteAndMountAndYearPourDimanche(this.getUniteSelected(), this.getMoisSelected(), this.getYearSelected());
     
    		if (listPersonneCompteurSemaine.size() > 0){
    			for(PersonneCompteurSemaineDisp persSemaineCompt : listPersonneCompteurSemaine){
    				PersonneCompteurSemaineDisp persCompteurDim = new PersonneCompteurSemaineDisp(); 
    				PersonneCompteurSemaineDisp persCompteurTotal= new PersonneCompteurSemaineDisp(); 
     
    				persCompteurDim.setNomPersonne(persSemaineCompt.getNomPersonne());
    				persCompteurDim.setPrenomPersonne(persSemaineCompt.getPrenomPersonne());
     
    				persCompteurDim.setDureeHeureDimanche(persSemaineCompt.getDureeHeureHeureDimancheTotalPersonne());
    				persCompteurDim.setDureeHeureJourFerie(persSemaineCompt.getDureeHeureHeureFerieTotalPersonne());
    				persCompteurDim.setDureeTravailJourMaladie(persSemaineCompt.getDureeTravailJourMaladie());
    				persCompteurDim.setNbCongeAnnuel(persSemaineCompt.getNbCongeAnnuel());
    				persCompteurDim.setNbCongeTri(persSemaineCompt.getNbCongeTri());
    				persCompteurDim.setNbCongeMaladie(persSemaineCompt.getNbCongeMaladie());
    				persCompteurDim.setNbCongeAnciennete(persSemaineCompt.getNbCongeAnciennete());
    				persCompteurDim.setNbCongeFormation(persSemaineCompt.getNbCongeFormation());  
    				persCompteurDim.setNbCongeSansSolde(persSemaineCompt.getNbCongeSansSolde());
    				persCompteurDim.setDureeTravailJourSansSoldes(persSemaineCompt.getDureeTravailJourSansSoldes());
    				persCompteurDim.setHeureSuppPaye(persSemaineCompt.getHeureSuppPaye());
    				persCompteurDim.setDateGenere(persSemaineCompt.getDateGenere());
    				persCompteurDim.setIdPersonne(persSemaineCompt.getIdPersonne());
     
    				listPersDimRecup.add(persCompteurDim);
     
    			}
    		}
    Dans c'est deux liste, il y a l'id de la personne.

    Comment je peux faire pour les comparer et récupérer les personne manquantes ?

    code globale :
    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
    39
    40
    41
    42
     
    		listePersonnePasEnCdd = this.personneService.getPersonneDTOPasCDDByUniteId(this.getUniteSelected());
    		if(listePersonnePasEnCdd.size() > 0){
    			for(PersonneDTO personnePasEnCdd : listePersonnePasEnCdd){
    				PersonneDTO persDto = new PersonneDTO();
    				persDto.setIdPersonne(personnePasEnCdd.getIdPersonne());
    				persDto.setNom(personnePasEnCdd.getNom());
    				persDto.setPrenom(personnePasEnCdd.getPrenom());
     
    				System.out.println("personnePasEnCdd : "+personnePasEnCdd.getNom());
    			}
     
    		}
     
    		listPersonneCompteurSemaine = this.compteurService.getListCompteurbyIdUniteAndMountAndYearPourDimanche(this.getUniteSelected(), this.getMoisSelected(), this.getYearSelected());
     
    		if (listPersonneCompteurSemaine.size() > 0){
    			for(PersonneCompteurSemaineDisp persSemaineCompt : listPersonneCompteurSemaine){
    				PersonneCompteurSemaineDisp persCompteurDim = new PersonneCompteurSemaineDisp(); 
    				PersonneCompteurSemaineDisp persCompteurTotal= new PersonneCompteurSemaineDisp(); 
     
    				persCompteurDim.setNomPersonne(persSemaineCompt.getNomPersonne());
    				persCompteurDim.setPrenomPersonne(persSemaineCompt.getPrenomPersonne());
     
    				persCompteurDim.setDureeHeureDimanche(persSemaineCompt.getDureeHeureHeureDimancheTotalPersonne());
    				persCompteurDim.setDureeHeureJourFerie(persSemaineCompt.getDureeHeureHeureFerieTotalPersonne());
    				persCompteurDim.setDureeTravailJourMaladie(persSemaineCompt.getDureeTravailJourMaladie());
    				persCompteurDim.setNbCongeAnnuel(persSemaineCompt.getNbCongeAnnuel());
    				persCompteurDim.setNbCongeTri(persSemaineCompt.getNbCongeTri());
    				persCompteurDim.setNbCongeMaladie(persSemaineCompt.getNbCongeMaladie());
    				persCompteurDim.setNbCongeAnciennete(persSemaineCompt.getNbCongeAnciennete());
    				persCompteurDim.setNbCongeFormation(persSemaineCompt.getNbCongeFormation());  
    				persCompteurDim.setNbCongeSansSolde(persSemaineCompt.getNbCongeSansSolde());
    				persCompteurDim.setDureeTravailJourSansSoldes(persSemaineCompt.getDureeTravailJourSansSoldes());
    				persCompteurDim.setHeureSuppPaye(persSemaineCompt.getHeureSuppPaye());
    				persCompteurDim.setDateGenere(persSemaineCompt.getDateGenere());
    				persCompteurDim.setIdPersonne(persSemaineCompt.getIdPersonne());
     
    				listPersDimRecup.add(persCompteurDim);
     
    			}
    		}
    Je vous remercie d'avance de votre aide

  2. #2
    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 : 54
    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 leara500 Voir le message
    Bonjour,

    A partir de la liste du personnel, il faudrait comparer les personnes qui ont leurs moisdisp qui a été généré, et indiqué les personnes qui n'ont pas eu leur moisdisp de générer.
    Je ne sais pas si ce que j'ai dit est compréhensible.
    Jusque là j'ai l'impression que ça va, mais c'est plus confus quand je lis le code après. Je ne comprends pas pourquoi déjà tu copies les instances que tu récupères dans les listes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(PersonneDTO personnePasEnCdd : listePersonnePasEnCdd){
    				PersonneDTO persDto = new PersonneDTO();
    				persDto.setIdPersonne(personnePasEnCdd.getIdPersonne());
    				persDto.setNom(personnePasEnCdd.getNom());
    				persDto.setPrenom(personnePasEnCdd.getPrenom());
    }
    A quoi sert persDto ? Pourquoi ne pas utiliser directement personnePasEnCdd.

    Quoiqu'il en soit, si j'ai bien compris :


    1. listePersonnePasEnCdd = this.personneService.getPersonneDTOPasCDDByUniteId(this.getUniteSelected());te permet d'obtenir une liste de personnes, modélisées par une classe PersonneDTO, donc une List<PersonneDTO>.


    2. listPersonneCompteurSemaine = this.compteurService.getListCompteurbyIdUniteAndMountAndYearPourDimanche(this.getUniteSelected(), this.getMoisSelected(), this.getYearSelected()); te permet d'obtenir une liste de PersonneCompteurSemaineDisp, donc une List<PersonneCompteurSemaineDisp>.


    3. tu dois chercher dans listePersonnePasEnCdd les personnes dont l'id correspond à l'id des PersonneCompteurSemaineDisp qu'on a dans listPersonneCompteurSemaine, c'est bien ça ?
      Donc simplement :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      for(PersonneCompteurSemaineDisp persSemaineCompt : listPersonneCompteurSemaine){
       
          String id = persSemaineCompt.getIdPersonne(); // je suppose que c'est cette méthode pour récupérer l'id
       
          // maintenant on cherche dans listePersonnePasEnCdd  la personne qui a cet id :
          listePersonnePasEnCdd.stream().filter(p-> p.getIdPersonne().equals(id))./** ici la suite dépendant de ce qu'on veut faire avec la personne trouvée **/
       
       
      }
      .


    4. Dans l'extrait au-dessus, je n'ai pas mis la fin du code, parce que si j'ai bien compris, tu ne cherches pas les personnes dans la liste, mais les autres, celles qui n'y sont pas.

      Si c'est bien le cas, on peut faire ça :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Set<PersonneDTO> listePresent = 
            listPersonneCompteurSemaine.stream()
                                       .flatMap( personne-> listePersonnePasEnCdd.stream()
                                                                                 .filter(p-> p.getIdPersonne().equals(personne.getIdPersonne()))) // ceci convertit le PersonneCompteurSemaineDisp en PersonneDTO
                                       .collect(Collectors.toSet()); // on récupère la liste des personnes distinctes de listePersonnePasEnCdd qui sont dans listPersonneCompteurSemaine (exactement qui ont le même idPersonne)
       
      listePersonnePasEnCdd.removeAll(listePresent); // on supprime tous ceux qu'on a récupérer, et donc ceux qui restent dans listePersonnePasEnCdd sont ceux qui ne sont pas dans listPersonneCompteurSemaine
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Merci infiniment de votre réponse.

    J'ai utilisé le bout de code que vous avez mis afin de récupérer les personnes qui n'ont pas vu leurs moisdisp généré, mais mon application ne comprend pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    set<PersonneDTO> listePresent = 
          listPersonneCompteurSemaine.stream()
                                     .flatMap( personne-> listePersonnePasEnCdd.stream()
                                                                               .filter(p-> p.getIdPersonne().equals(personne.getIdPersonne())))
    Il me mets pleins d’alerte bizarre pour le "stream", "fatMap", etc...

    J'ai donc fait :

    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
     
    List<PersonneCompteurSemaineDisp> listPersonneMoisDispPasGenere = null;
     
    		listePersonnePasEnCdd = this.personneService.getPersonneDTOPasCDDByUniteId(this.getUniteSelected());
    		if(listePersonnePasEnCdd.size() > 0){
    			for(PersonneDTO personnePasEnCdd : listePersonnePasEnCdd){
    				PersonneDTO persDto = new PersonneDTO();
    				persDto.setIdPersonne(personnePasEnCdd.getIdPersonne());
    				persDto.setNom(personnePasEnCdd.getNom());
    				persDto.setPrenom(personnePasEnCdd.getPrenom());
     
    				if (listPersonneCompteurSemaine.size() > 0){
    					for(PersonneCompteurSemaineDisp persSemaineCompt : listPersonneCompteurSemaine){
     
    						System.out.println("persSemaineCompt.getIdPersonne() : "+persSemaineCompt.getIdPersonne());
    						System.out.println("personnePasEnCdd.getIdPersonne() : "+personnePasEnCdd.getIdPersonne());
     
    						if(persSemaineCompt.getIdPersonne()!=personnePasEnCdd.getIdPersonne()){
     
    							System.out.println("persSemaineCompt.getIdPersonne()!=personnePasEnCdd.getIdPersonne(");
    						}
     
     
    					}
     
     
    				}
     
     
     
     
    			}
     
    		}
     
    		listPersonneMoisDispPasGenere = listePersonnePasEnCdd.removeAll(listPersonneCompteurSemaine);
    Je récupère les bonnes id de personnes mais je suis bloquée pour récupéré les id des personnes qui n'ont pas leur moisdisp de générer. Auriez vous une piste s'il vous plait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listPersonneMoisDispPasGenere = listePersonnePasEnCdd.removeAll(listPersonneCompteurSemaine);
    Ceci ne marche par car il vaut un booléan et je ne comprend pas pourquoi
    Je vous remercie d'avance.

  4. #4
    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 : 54
    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
    Citation Envoyé par leara500 Voir le message
    Il me mets pleins d’alerte bizarre pour le "stream", "fatMap", etc...
    Bah je pense que tu utilises une très vieille version de Java. Les Stream sont apparus en Java 8 et là on est en version 13 quand même...

    Citation Envoyé par leara500 Voir le message
    J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    						if(persSemaineCompt.getIdPersonne()!=personnePasEnCdd.getIdPersonne()){
    On ne compare jamais des String, ou plus généralement des objets, avec == mais avec equals (cf voir mes exemples, ou la méthode Objects.equals(obj1,obj2)).
    == est l'opérateur d'identité pas d'égalité et il teste l'égalité des références des objets et il n'y a aucune garantie que deux String de même valeur soient identiques, en particulier quand on ne les a pas construites soi-même.

    Evidemment, le corollaire est vrai avec l'opérateur de différence != et que l'on doit remplacer par une négation d'un test d'égalité (genre !(persSemaineCompt.getIdPersonne().equals(personnePasEnCdd.getIdPersonne())) ou !Objects.equals(persSemaineCompt.getIdPersonne(), personnePasEnCdd.getIdPersonne())
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Malheureusement, je n'ai pas la main sur les librairies

    Il n'y a pas d'autre moyen ?

    J'aimerai pouvoir comparer les éléments de deux listes différentes et de mettre dans une troisième liste, les éléments manquant

  6. #6
    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 : 54
    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
    Bah l'autre moyen c'est de faire la boucle imbriquée par un for, et de tester l'égalité des id, par equals(). A chaque itération tu stockes et tu peux faire le removeAll à la fin.


    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
     
    Set<PersonneDTO> listePresents = new HashSet<>();
    for(PersonneCompteurSemaineDisp persSemaineCompt : listPersonneCompteurSemaine){
     
        String id = persSemaineCompt.getIdPersonne(); // je suppose que c'est cette méthode pour récupérer l'id
     
        // maintenant on cherche dans listePersonnePasEnCdd  la personne qui a cet id :
        for(PersonneDTO personneDTO : listePersonnePasEnCdd) {
             if (  personneDTO .getIdPersonne().equals(persSemaineCompt.getIdPersonne()) ) {
                   listePresents.add(personneDTO);
                   break;
             }
        }
     
    }
     
    listePersonnePasEnCdd.removeAll(listePresents);
     
    // ici listePersonnePasEnCdd ne contient plus que les personnes dont l'id ne correspond à aucun id de PersonneCompteurSemaineDisp de listPersonneCompteurSemaine
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 360
    Points : 139
    Points
    139
    Par défaut
    Merci infiniment de votre aide. Vous m'enlevez une grosse épine du pieds

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

Discussions similaires

  1. [Débutant] Comment sélectionner les éléments d'une liste ?
    Par kheironn dans le forum Entity Framework
    Réponses: 2
    Dernier message: 17/05/2013, 11h36
  2. comparer les éléments de deux tableaux
    Par Nayra dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/11/2010, 16h26
  3. Réponses: 3
    Dernier message: 18/03/2008, 21h55
  4. Réponses: 4
    Dernier message: 26/07/2007, 10h49
  5. Réponses: 3
    Dernier message: 15/05/2006, 16h09

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