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 :

hashSet, collection et doublon


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 41
    Par défaut hashSet, collection et doublon
    Bonjour à tous! Voilà, j'ai parcourus quelques pages du forum mais ai abandonné devant la quantité astronomique de sujets, donc désolé si le sujet à déjà été abordé!

    Voilà mon problème: utilisant un <code>hashSet</code> pour gérer les doublons d'une liste remplis à partir de fichiers de données, je le remplis convenablemant a partir de différents fichiers: etu1,ens1,... (1 fichier par personnes)

    La hierarchie globale c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Etudiant extend Personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enseignant extend Personne
    Je remplis donc mon hashSet de personne comme ceci:
    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
     
    public void testSet()
    	{
     
    		Iterator <Personne> it = listPers.iterator();
    		Set<Personne> monHashSet=new HashSet<Personne>(); // on crée notre Set
    		while(it.hasNext())
    		{
    			System.out.println(monHashSet.add(it.next())); // On remplit le set à partir de la liste en utilisant un iterator
    			System.out.println("******************************************");
    		}
     
    		Iterator<Personne> i=monHashSet.iterator(); // on crée un Iterator pour parcourir notre HashSet
    		while(i.hasNext()) // tant qu'on a un suivant
    		{
    			System.out.println(i.next()); // on affiche le suivant
    			System.out.println("******************************************");
    		}
    listPers passer comme attribut de la classe testCollection

    et elle est remplis par:
    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
     
    public void testAjout()
    	throws IOException
    	{
     
    		Enseignant ens ;
    		Ask dem = new Ask("donnees/ens1.don");
    		Etudiant et ;
    		Ask dem2 = new Ask("donnees/etu1.don");
    		Etudiant et1b;
    		Ask dem7 = new Ask("donnees/etu1.don");
     
    		try
    		{
    			ens = new Enseignant(dem);
    			et = new Etudiant(dem2);
    			et1b = new Etudiant (dem7);
    			ajoutDePersonnes(ens);
    			ajoutDePersonnes(et);
    			ajoutDePersonnes(et1b);
    		} catch (Exception e)
    		{ System.out.println("Erreur : "+ e.getMessage()); }
    	}
    La méthode ajout de personne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void ajoutDePersonnes(Personne pers)
    	{
    		listPers.add(pers);
    	}
    Or ce test me donne un Set avec doublon, ce qui normalement ne devrait pas.

    Bien sur j'ai redéfini dans la classe Personne par override la méthode equals donc je ne comprend pas pourquoi le set ne fonctionne pas.

    *Ask fait partie d'une classe créer pour entrer des données par un flux:
    Ask(): appel une saisie clavier
    Ask(String fichier): remplis a partir d'un fichier fichier

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Iceman Y15 Voir le message
    Bien sur j'ai redéfini dans la classe Personne par override la méthode equals donc je ne comprend pas pourquoi le set ne fonctionne pas.
    Et qu'en est-il de la méthode hashCode() ?
    On pourrait voir ce code ?

    a++

  3. #3
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private int comparerNomPrenom(Personne pers)
    	{
    		int comp = nom.compareTo(pers.nom) ;
    		if (comp==0)
    			comp = prenom.compareTo(pers.prenom) ;
    		return comp ;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Override
    	public boolean equals(ObjetOrdonne pers2)
    	{
    		  if (this.nom!=null)
    			  if (pers2 instanceof Personne)
    				  	{
    				  		if(comparerNomPrenom((Personne) pers2) ==0);
    				  		return true;
    				  	}
    		return false;
    	}
    }

  4. #4
    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
    Quand on étend equals(), on doit étendre hashCode() de sorte que deux objets qui sont égaux aient toujours le même hashCode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    +1

    La plupart des collections avec table de hash sépare d'abord les objets selon leurs hashCode, ce qui permet de ne comparer que les objets avec un hashCode identique.

    Si tu ne redéfinis pas hashCode() tous tes objets auront des hashCode différent y compris si leurs valeurs sont identique

    Dans ton cas, cela devrait donner quelque chose comme cela (en présumant que les champs ne peuvent pas être null) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Override
    public int hashCode() {
        int result = 1;
        result = 31 * result + this.nom.hashCode();
        result = 31 * result + this.prenom.hashCode();
        return result;
    }
    Plus de détail dans la FAQ : Pourquoi et comment redéfinir la méthode hashCode() ?


    a++

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Par défaut
    tien question quelqu'un a t'il déjà utiliser Jakarta Common Lang HashCodeBuilder ?
    ça simplifie vraiment la vie?
    ça donne quoi niveau performance (+/- bien que fait à la main)?

    question à titre indicatif car je ne connais pas cette class mais la FAQ l'evoque

Discussions similaires

  1. [HashSet] C'est possible de mettre des doublons ! :-(
    Par Melchisedec dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 27/07/2007, 11h15
  2. HashSet, probleme de doublon et parcour
    Par fusion_sadam dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2007, 15h07
  3. [Collections] Mixer plusieurs ArrayList en supprimant les doublons
    Par vallica dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 16/05/2006, 15h01
  4. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15

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