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

avec Java Discussion :

Comparer 2 objets JAVA


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comparer 2 objets JAVA
    Bonjour,

    Dans le cadre d'un projet, je dois comparer 2 MAP d'objets (Objet : Employé) et faire ressortir les différences des valeurs de chaque objet.

    MAP 1 = Key : 1 | Valeur :: Nom : Dupont Prenom : Tony Age : 15
    = Key : 2 | Valeur :: Nom : Socle Prenom : Eric Age : 17
    = Key : 3 | Valeur :: Nom : Lou Prenom : Sophie Age : 17

    MAP 2 = Key : 1 | Valeur :: Nom : Dupont Prenom : Tony Age : 15
    = Key : 2 | Valeur :: Nom : Socle Prenom : Eric Age : 15
    = Key : 3 | Valeur :: Nom : Lou Prenom : Sophie Age : 17
    Résultat que j'ai actuellement :

    Key : 2
    MAP 1 = Valeur :: Nom : Socle Prenom : Eric Age : 17
    MAP 2 = Valeur :: Nom : Socle Prenom : Eric Age : 15
    ATTRIBUT DIFFERENT = AGE
    Cependant dans mon objet Employé, j'ai maintenant une liste d'un autre objet (facture)

    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
     
    public static HashMap<String, List<String>> comparaisonMap(HashMap<String,Facture> mapEmp_1, HashMap<String,Facture> mapEmp_2){
     
    		HashMap<String, List<String>> resultat = new HashMap<String, List<String>>() ;
    		List<String> difList = new ArrayList<String>();
     
    		for (String cle: mapEmp_1.keySet()){
    		      if (mapEmp_2.containsKey(cle)) {
     
    		          difList = mapEmp_1.get(cle).test(mapEmp_2.get(cle));
     
     
    		      	  resultat.put(cle, difList);
     
    		          }
     
     
    		}
     
    		return resultat;


    Ma méthode de comparaison actuellement dans l'objet employée :

    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 List<String> test(Employe obj) {
     
    		List<String> difList = new ArrayList<String>();
    		final Employe other = (Employe) obj;
     
    		if (nom == null) {
    			if (other.nom != null){
    				System.out.println("nom");
    				difList.add(other.nom);
    			}
     
    		} else if (!nom
    				.equals(other.nom)){
    			System.out.println("nom");
    			difList.add(other.nom);
    		}
    Comment je peux faire pour pouvoir comparer ma liste d'objet Facture dans ma fonction test ?

    Merci d'avance

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Après l'employé, la facture et ensuite, le véhicule de service

    Plus sérieusement, je pense que le professeur veut le code le plus générique possible;

    Pour comparer 2 objets de même type, il s'attend à ce que tu surcharge la méthode equals.
    C'est assez complexe, et on arrive vite à des pièges à con.
    Tu trouvera des indications ici:
    https://docs.jboss.org/hibernate/sta...shashcode.html

    A noter que si tu surcharge equals, il faut aussi surcharger hashcode.

    On limite le nombre de ligne de code par la classe Objects (Objects.equals et Objects.hash).

    Avec eclipse, il est possible de générer ces 2 méthodes.

    Enfin, la référence sur le sujet est le Joshua Bloch:
    https://www.amazon.fr/gp/product/B07...t_bibl_vppi_i0

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement j'ai surchargé la méthode equals de la classe employe :

    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 List<String> equals(Employe obj) {
     
    		List<String> difList = new ArrayList<String>();
    		final Employe other = (Employe) obj;
     
    		if (nom == null) {
    			if (other.nom != null){
    				System.out.println("nom");
    				difList.add(other.nom);
    			}
     
    		} else if (!nom
    				.equals(other.nom)){
    			System.out.println("nom");
    			difList.add(other.nom);
    		}
    Cependant, j'ai rien fait pour la méthode Hashcode est-ce problématique ? Lors de mes tests la comparaison marche bien.

    Ma méthode compare les attributs d'un objet similaire et me stock dans une liste les différences. Désormais dans ma classe employe j'ai une liste d'objet facture.

    Je sais pas comment faire pour faire lorsque je compare mes 2 objets employe pendant ma comparaison qu'on compare également mes objets facture dans liste une a une.

    Je dois surement surchargé le méthode equals dans ma classe facture, mais pour parcourir la liste ca le fait automatiquement ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (String cle : mapFacture.keySet()) {
    			 if (other.mapFacture.containsKey(cle)) {
     
     
     
    			 }	  
          	}
    j'essaye de faire ça dans la methode equals de employe, mais je bloque
    Dernière modification par Invité ; 09/06/2021 à 14h27.

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Non!
    Je parles de la méthode equals de la classe objet.
    https://docs.oracle.com/javase/7/doc...ng/Object.html

    Elle retourne un booléen et prend en paramètre un objet.

    Ce qui donne (Evidemment, j'essaye de réduire le nombre de ligne de code):
    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
     
    @Override
    public boolean equals(Object obj){
        if(this == obj){
            return true;
        }
        if(obj == null){
            return false;
        }
        if(getClass() != obj.getClass()){
            return false;
        }
        Employe other = (Employe)obj;
        return Objects.equals(this.nom, other.nom) && Objects.equals(this.prenom, other.prenom) && Objects.equals(this.age, other.age);
    }
    Je lis que l'employé a un nom, un prénom et un age...

    Pour hashcode, on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Override
    public int hashCode(){
      return Objects.hash(nom, prenom, age);
    }

    Les deux méthodes sont dans la classe Employe. Le @Override signale que l'on surcharge les deux méthodes d'une classe mère (en l'occurence Object).

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    ça s'appelle redéfinir, pas surcharger. Ce qui en anglais se dirait overload, pas override. Mais la surcharge, ça n'est rien de bien notable. Ce sont des méthodes de même nom (mais pas les mêmes paramètres, ce serait impossible), et le fait qu'elles aient le même nom ne fait rien de particulier.

    Et concernant la question, j'ai pas compris ce qui est demandé.

    S'il y a des employés de même clé qui n'ont pas le même âge, il faut afficher les employés de cette clé dans les deux maps, et dire que ce qui est différent c'est l'âge. (Au passage, equals() n'aide pas à faire ça. equals() dit si oui ou non ils ont les mêmes valeurs. Quand ce n'est pas le cas equals() ne dit pas pourquoi ce n'est pas le cas.)
    Et quand ils n'ont pas les mêmes factures, il faut faire quoi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour faire simple :

    J'ai un objet Employe qui a comme attribut des String et une Map<String, Acte> et mon objet Acte comporte que des attributs String.

    Actuellement j'ai 2 map<String, Employe> que je dois comparer et faire ressortir les différences.

    Je compare les attributs String des Employes dans ma map, mais comment je fais pour faire une comparaison entre les MAP se trouvant dans mon objet Employe

    Je veux comparer les map<String, Acte> se trouvant dans mes objets employe

Discussions similaires

  1. Comparer des objets Java
    Par MicroPuce dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 04/04/2012, 19h48
  2. [Collections][HashMap]Comparer les objets de la hashmap
    Par rvfranck dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 16/12/2005, 21h29
  3. Réponses: 3
    Dernier message: 28/10/2005, 01h12
  4. [Excel][VBA][Java] Appeler un objet java
    Par ay_pepito dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/07/2005, 15h46
  5. [SAX] Passer d'objet java en fichier XML?
    Par spoutyoyo dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 05/01/2005, 08h31

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