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

GWT et Vaadin Java Discussion :

HashMap class IsSerializable


Sujet :

GWT et Vaadin Java

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut HashMap class IsSerializable
    Bonjour,

    J'essay d'utiliser des superclass de Map. en prenant comme clé une class qui est implement isserialisable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		Map<Noeud,Noeud> parents = new HashMap<Noeud,Noeud>();
    Et il est impossible de récupérer les données en utilisant un get(key). Je pense que ça vient du fait que ma class Noeud est isserialisable. Pour pouvoir utiliser le HashMap je suis obligé de convertir la class Noeud en String. Mais je trouve pas ce procédé très propre. N'existe t-il pas une autre solution?

  2. #2
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    sans entrer dans GWT, tes Noeuds clé sont bien immutable?

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    immutable? c'est à dire?

    Voila ma class Noeud:
    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
    public class Noeud implements IsSerializable
    {
    	private int x;
    	private int y;
     
    	public Noeud (){}
     
    	public Noeud (int x, int y){
    	  this.x=x;
    	  this.y=y;
    	}
     
    	public int getX() {
    		return x;
    	}
     
    	public void setX(int x) {
    		this.x = x;
    	}
     
    	public int getY() {
    		return y;
    	}
     
    	public void setY(int y) {
    		this.y = y;
    	}
     
    	public String toString()
    	{
    		return x+","+y;
    	}
    	public boolean equals(Point a)
    	{		
    		return (x==a.getX() && y==a.getY());
    	}
     
    }

  4. #4
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ca veux dire qu'elle ne change plus après être ajoutée à la hashmap.

    Note: dans ton cas, je vois déjà un problème, tu redéfini equals mais pas hashcode. Hors pour que hashmap fonctionne, il faut que si a.equals(b), alors a.hashcode()==b.hashcode() !

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Si je fais ca c'est mieu?
    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
    public class Noeud implements IsSerializable
    {
    	private int x;
    	private int y;
     
    	public Noeud (){}
     
    	public Noeud (int x, int y){
    	  this.x=x;
    	  this.y=y;;
    	}
     
    	public int getX() {
    		return x;
    	}
     
    	public void setX(int x) {
    		this.x = x;
    	}
     
    	public int getY() {
    		return y;
    	}
     
    	public void setY(int y) {
    		this.y = y;
    	}
     
    	public String toString()
    	{
    		return x+","+y;
    	}
    	public boolean equals(Noeud a)
    	{		
    		return a.hashCode()==hashCode();
    	}
    	public int hashcode() {
    		return x*100+y;
    	}
     
    }

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Je maitrise pas l'utilisation du hasCode :/

    J'y arrive pas!

  7. #7
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Pour info, si tu utilises Eclipse, tu peux générer simultanément la méthode equals et hashcode (dans le menu contextuel Source>Generate hashcode () and equals()

    Pour ce qui est de GWT, si ta classe Noeud est dans un package "client", il ne devrait pas y avoir de problème. En plus de IsSerializable, il faut qu'elle est un constructeur sans argument (ce qui semble être ton cas).

    Il te retourne quoi comme erreur ?

  8. #8
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par totofe Voir le message
    Si je fais ca c'est mieu?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	public boolean equals(Noeud a)
    	{		
    		return a.hashCode()==hashCode();
    	}	
    }
    Non, c'est l'implémentation par défaut de equals là. Si t'as deux noeuds avec les mêmes x,y, mais des instances différentes, ils vont poser problème car pas égaux (hashcode différents).
    un implémentation sommaire serait, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public boolean equals(Noeud a)
    	{		
    		return (x==a.getX() && y==a.getY());
    	}
            public int hashcode (){
                return getX() | (getY()<<16);
            }
    }

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    hum...
    Je pense qu'il reste tout de même le souci que la class est isSerialisable.
    J'ai modifié la class Noeud et j'ai testé avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for( Iterator it =getNoeuds().entrySet().iterator(); it.hasNext(); ){
        		java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
        		Noeud noeudV  = (Noeud )entry.getValue(); 
    			Noeud noeudK=(Noeud ) entry.getKey();
    			System.out.println("hasCode new: "+ new Noeud(noeudK.getX(),noeudK.getY()).hashCode());
    			System.out.println("hasCode: "+noeudK.hashCode());
    			System.out.println("contain new: "+getNoeuds().containsKey(new Noeud(noeudK.getX(),noeudK.getY())));
    			System.out.println("contain: "+getNoeuds.containsKey(noeudK));
    		}
    Et voila ce que je recois:


    hasCode new: 1245203
    hasCode: 1245203
    contain new: false
    contain: true

  10. #10
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il manque un test equals entre le nouveau et l'ancien noeud pour tout vérifier

  11. #11
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Oui le equals est correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("equals: "+noeudK.equals(new Noeud(noeudK.getX(),noeudK.getY())));
    donne:

    equals: true


    Mais il retournait déjà vrai avant que je touche au hashCode.

  12. #12
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    C'est good j'ai trouvé. En relisant le topic j'ai vu le message de benwit que j'avais loupé. Et k'ai fait la génération automatique du 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;
    		Point other = (Point) obj;
    		if (x != other.x)
    			return false;
    		if (y != other.y)
    			return false;
    		return true;
    	}
    Effectivement le parametre en entrée est de type Object, je pense que le souci venais de la. En refesant le même test je recoi ce message:

    hasCode new: 1569
    hasCode: 1569
    contain new: true
    contain: true
    equals: true


    Merci à tous les 2!!

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

Discussions similaires

  1. Fuites mémoire dans une classe "java.util.HashMap$Entry"
    Par ladyingold dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 10/02/2012, 15h51
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. Réponses: 1
    Dernier message: 24/08/2009, 12h03
  4. Hashmap, hashset et classes !
    Par helmutobrian dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 16/03/2009, 22h11
  5. Réponses: 31
    Dernier message: 30/03/2006, 16h57

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