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 :

hashmap methhode equals


Sujet :

Collection et Stream Java

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut hashmap methhode equals
    Bonjour a tous.

    J ai un petit souci.Je dois comparer l egalite de 2 hashmap (les cles sont des MultiKeys et les valeurs des float).Cela marche a priori bien sauf pour une chose :

    Quand les valeurs sont :
    0.0 et -0.0 sont pour lui , different, ce qui n est pas correct.

    Comment palier a ce probleme ?

    Merci

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    s'il n'y avait que ce problème! voir doc de Float méthode equals .
    reécrire sa propre classe MonFloat pour l'adapter à ses besoins? (ça a du être fait quelque part...)
    question intéressante....

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Par défaut
    C'est là tout le problème avec l'utilisation des float et des double, c'est qu'il faut prendre en compte les erreurs d'approximation.

    Voici un petit exemple pour comprendre ce qu'il se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Float a =  0.0000001f / Float.MAX_VALUE;
    Float b = -0.0000001f / Float.MAX_VALUE;
    System.out.println("a = "+a+" ; hashcode = "+a.hashCode());
    System.out.println("b = "+b+" ; hashcode = "+b.hashCode());
    System.out.println("a == b ? "+(a==b));

    A l'exécution, on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = 0.0 ; hashcode = 0
    b = -0.0 ; hashcode = -2147483648
    a == b ? false

    Bon j'ai pris un exemple où a et b sont mathématiquement différent, mais on peut retomber sur ce cas là avec des calculs plus complexe où a et b devraient être égaux. Et pour le système, a et b sont effectivement bien différent.

    Comment s'en sortir ? Il faut se définir une marge d'erreur. Pour l'égalité, ça devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double delta = 0.0000001;
    System.out.println("a == b ? "+(Math.abs(a-b) < delta)); // affiche true
    Pour les hashcode, c'est plus complexe, il faut redéfinir le hashcode pour tenir compte d'un delta, en créant une classe qui englobe le float et en redéfinissant le hashcode.

    Si tu peux utiliser un TreeMap au lieu du HashMap, c'est beaucoup plus simple, tu as juste besoin de définir un Comparator en utilisant la comparaison du code ci-dessus.

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par olivier-utrema Voir le message

    Comment s'en sortir ? Il faut se définir une marge d'erreur. Pour l'égalité, ça devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double delta = 0.0000001;
    System.out.println("a == b ? "+(Math.abs(a-b) < delta)); // affiche true
    .
    Hmmmm voir : http://floating-point-gui.de/errors/comparison/

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut
    Ok merci de votre aide.


    J ai du coup essayer de faire une methode comparant une a une mes valeurs avec un delta tout ca tout ca, j ai du bug mais je corrigerai ca demain.
    Au final c est quand meme ridicule je trouve de ne pas pouvoir "simplement" comparer deux float, ou deux double...je ne vois aps l interet ici d etre aussi pointilleux :/
    C est une histoire de ressource machine ? d algorithme?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    On peut, mais par conséquence de leur représentation approchée, nécessaire à leur fonction, 0 et -0 sont deux doubles différents, tout comme 1 - 0.9 et 0.1 sont deux doubles différents.

    Par nature, ce que tu veux c'est tester des valeurs "suffisamment proches pour qu'on puisse soupçonner qu'en représentation exacte elles seraient en fait identiques."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    les cles sont des MultiKeys et les valeurs des float
    Est-il absolument indispensable d'avoir des float (si tu peux choisir... ) ?

Discussions similaires

  1. redéfinition equals, hashmap et get
    Par oc_alex86 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/05/2007, 15h52
  2. Surcharge de l'égalité et HashMap
    Par olivierM dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 10/06/2004, 09h54
  3. [STRUTS] Tag Equal, comparer deux variables
    Par logica dans le forum Struts 1
    Réponses: 2
    Dernier message: 04/06/2004, 12h01
  4. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 09h04
  5. [débutant] cherche a copier une HashMap
    Par mathieublanc13 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/05/2004, 14h33

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