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 :

recherche d'un element dans hashtable


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut recherche d'un element dans hashtable
    Bonjour,
    Pour en finir avec le hashtable, et merci à ceux qui m'ont aidé hier.
    Le principe de recherche lorsqu'on fait par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            maTable = new Hashtable();
            Roman livre = new Roman("A l'Ouest", 1);  
            maTable.put(1, livre);
            livre = new Roman("A l'Est..", 2);
            maTable.put(2, livre);
           ...
     //Pour retrouver le livre A l'Ouest 
             livre = (Roman)maTable.get(1);
    Donc la démarche : lors de la recherche get(1), ne renvoi pas directement l'objet , il regarde le hashCode correspondant. Cependant ce hashCode peut-être correspondre a une seule clé ou a plusieurs, dès lors la méthode equals intervient pour vérifier la cocordance de l'attribut, et renvoi le bon objet.?
    merci de vos corrections

  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 totoche Voir le message
    Donc la démarche : lors de la recherche get(1), ne renvoi pas directement l'objet , il regarde le hashCode correspondant. Cependant ce hashCode peut-être correspondre a une seule clé ou a plusieurs, dès lors la méthode equals intervient pour vérifier la cocordance de l'attribut, et renvoi le bon objet.?
    Non : tu utilises des Integer comme clef et le hashcode d'un Integer correspond à sa valeur...

    get(1) renvoi directement l'élément livre associé.


    a++

  3. #3
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut
    Bonjour adiGuba, et merci de ta promptitude
    mais alors comment fait on lorsqu'on n'utilise pas un integer comme clé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            maTable = new Hashtable();
            Roman livre = new Roman("A l'Ouest", 1);  
            maTable.put(livre, livre);
            livre = new Roman("A l'Est..", 2);
            maTable.put(livre, livre);
           ...
     //Pour retrouver le livre A l'Ouest 
             livre = (Roman)maTable.get(?);
    merci

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Peut-etre dans ce cas precis (ou l'objet est sa propre cle) peut-etre n'est-il pas pertinant d'utiliser une Map.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Je crois que tu confonds un peu tout.

    Reprenons depuis le début :

    Un HashTable est une collection qui associe une clé à une valeur. Ici, tu as associé un Integer (la clé) à un Roman (la valeur).

    Lorsque tu veux récupérer un Roman, tu appelles get et tu lui passes une valeur, à savoir dans ton exemple l'entier 1.

    Comment fait Java derrière : il compare dans toutes les valeurs celle qui est exactement égale à 1.
    Or, on sait que la fonction hashCode renvoie un entier qui sera toujours le même pour un objet donné, donc java sait que le hashCode de la clé que tu lui donne et le hashCode de la clé mémorisée sont strictement identique. Mais il sait aussi que deux objets inégaux n'ont pas forcément un hashCode différents. Le hashCode lui permet donc de filtrer les clés pour faire une recherche qu'on pourrait qualifier d'élaguée. Si, sur un éventail de 10 000 clés, seules 25 ont le même hashCode que la clé que tu recherches, c'est d'autant plus rapide, celà ne fait, au plus, que 25 appels à equals.

    Donc, en résumé, hashCode est une fonction pour élaguer la recherche, equals une fonction pour la recherche en elle même.

    Lorsque tu n'utilise pas un Integer comme clé, c'est exactement la même chose : tu redéfinis hashCode (il est d'usage de faire renvoyer à hashCode la somme des hashCode des objets composant l'objet en lui même) et equals.

    Exemple :

    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
    class MonObjet
    {
       Integer numero;
       String name;
       public int hashCode()
       {
          return name.hashCode()+numero.hashCode();
       }
       public boolean equals(Object o)
       {
          if(! o instanceof MonObjet)
             return false;
          MonObjet temp=(MonObjet)o;
          return numero.equals(temp.numero) && name.equals(temp.name);
       }
    }

    J'espère que j'ai été assez clair, sinon n'hésite pas à demander !

    F.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Pour illustrer ce qu'a dit Mavina voici un schema tel que l'utilisaient mes profs de C a la fac pour nous expliquer le fonctionnement d'une (Hash)Map. Attention il s'agit uniquement d'une representation parmi d'autres, cela ne sous-entend pas qu'une Map est forcement implementee via des listes chainees.

    Soient les cles Ka, Kb, Kc, Kd, Kn, Kp et Kz. Par la fonction de haschage Hash() nous avons :

    Hash(Ka) = Hash(Kc) = H0

    Hash(Kz) = Hash(Kd) = Hash(Kp) = H1

    Hash(Kb) = H2

    Hash(Kn) = Hm

    On voit bien q'une requete sur Hash(Kc) va retourner H0 soit 2 cles possibles : Ka et Kc. On compare alors les cles jusqu'a trouver Kc et on retourne l'objet Vc qui lui est associe.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre éprouvé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Par défaut
    J'ai compris que lors de l'insertion dans une table il y a d'une part la clé et l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maTable.put(key, objet);
    et d'autre part la génération de son code, via la méthode hascode.
    tout les objets ont une clé et une seule, mais certains peuvent avoir le même code, généré par la méthode hashcode.
    [/CODE]

    Quand la méthode hashCode() est-t'elle utilisée ? Lors de l'insertion d'un élément dans un Hashtable, la méthode hashCode() est appelée pour classer l'instance dans un sous-ensemble. Lors de la recherche d'un élément, la méthode hashCode()sur l'instance à rechercher sert à sélectionner le sous-ensemble correspondant
    http://www.prados.fr/Langage/Java/hashCode/hashCode.pdf

    Mais comment fait-on sans parcourrir tout la table ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     for (Enumeration e = maTable.keys(); e.hasMoreElements();){
            livre = (Roman)maTable.get(e.nextElement());
            if (livre.getTitre()=="LivreRecherche"){
    (il est d'usage de faire renvoyer à hashCode la somme des hashCode des attributs composant l'objet en lui même)
    donc si l'on est capable de reconstruire le hashCode de l'ojet qu'on recherche on doit pouvoir boucler que sur les clés ayant le même hashcode, non?

    je sais je suis un
    quand j'aurai compris j'aurai compris...
    Merci de votre ++ Aide

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

Discussions similaires

  1. Recherche d'element dans un document XML
    Par FlyByck dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/07/2010, 20h37
  2. [XLINQ] Recherche Element dans tous les niveaux
    Par CARNIBAL dans le forum Linq
    Réponses: 2
    Dernier message: 18/05/2009, 11h12
  3. Recherche sur 2 elements dans une liste box.
    Par molarisapa dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 18h43
  4. Rechercher un element dans un msflexgrid et selection
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 28/11/2005, 08h09
  5. Recherche Element dans une liste
    Par hellodelu dans le forum ASP
    Réponses: 7
    Dernier message: 19/08/2005, 10h56

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