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 :

[QST] hashSet et ajout en double


Sujet :

avec Java

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut [QST] hashSet et ajout en double
    Bonjour a tous,

    Je voudrai utilisé hashSet pour stocker certain objet de ma class.
    Le problème est que, je me retrouve avec dans ma structure de données, des doublons d'objet (parametre identique, ref mémoire differente).

    Je pense donc que le problème vients de la méthode qui est appelé pour le add.
    Je pense que celle-ci ne vérifie que les ref mémoire.

    Alors je me suis dit que je devais redéfinir la méthode equals dans ma classe des objets de la hashSet. Mais la le probleme est que même avec une méthode qui renvoie toujours true, les add sont tous de même effectué.

    Avez vous une idée de solution pour mon probleme ?


    PS/ le code de ma fonction equals de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public boolean equals(Object obj){
     System.out.println("test"); //n'est jamais affiché ....
    		return true;
     
    	}

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    quand vous redéfinissez la méthode equals, vous devez aussi redéfinir la méthode hashcode. C'est elle que le hashset utilise en priorité.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    D'accord, donc voici ma methode equals
    seul un tableau a deux dimension (contenant des String) présent dans mon objet est utile pour faire la difference.

    Donc, cette méhode vous parai t'elle correcte?
    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
     
    public boolean equals(Object obj){
     
     
    		 // Vérification de l'égalité des références
            if(obj==this){
            	return true;
            }
     
            // Vérification du type du paramètre
            if (obj instanceof Plateau) {
            	Plateau p=(Plateau)obj;
     
            	for(int i=0;i<this.taille;i++){
            		for(int j=0;j<this.taille;j++){
            			if(this.tabCoul[i][j]!=p.tabCoul[i][j])
            				return false;
            		}
            	}
     
            }
    		return true;
     
    	}
    Et voici ma methode hashCode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
             * redéfinition de la méthode hashCode pour l'insertion des solution sans doublons
             */
    	public int hashCode() {
    		int result = 7;
    	    final int multiplier = 17;
     
    	    for(int i=0;i<this.taille;i++)
        		for(int j=0;j<this.taille;j++)
        				result = multiplier*result+this.tabCoul[i][j].hashCode();
     
    		return result;
    	}
    Cette methode vous semble t'elle correct ?

    (tabCoul est un tableau bi-dimensionnel de String)

    Encore merci pour votre aide


    EDIT: les fonctions ne semble pas fonctionner ...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    vous devez

    1) vérifier au préalable que le tailles sont les même (sinon, vous aurez des Arayindexoutofbound durant l'appel à equals)

    2) tester l'égalité entre string via leur méthode equals:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.tabCoul[i][j].equals(p.tabCoul[i][j])
    Attention a tenir compte aussi des cas où les cases sont à null si c'est possible.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    effectivement, le changement de != par la methode equals pour mes String résoud mon probleme.

    Merci pour votre aide

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

Discussions similaires

  1. [QST] Fusion de cellule et double titre
    Par hannibal.76 dans le forum Composants
    Réponses: 0
    Dernier message: 03/06/2011, 20h13
  2. [AC-2003] enregistrements ajoutés dans une table en double dans la requête
    Par alainmante dans le forum IHM
    Réponses: 4
    Dernier message: 13/04/2009, 14h04
  3. Ajout d'objet dans un HashSet (Doublon)
    Par gbinico dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/07/2008, 14h28
  4. dataset add row ne pas ajouter de clé double?
    Par gregcat dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/01/2008, 11h25
  5. [Conception] double ajout dans la base
    Par cell dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/06/2006, 09h25

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