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 :

Utilisation d'une Hashtable


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut Utilisation d'une Hashtable
    Bonjour tout le monde,

    Je souhaiterais avoir un tableau d'entiers indexé par deux chaines de caractères.

    J'ai cru comprendre que les hashtable étaient adaptées pour cela. Cependant j'ai un petit problème pour leur utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Hashtable<String[],Integer> test = new Hashtable<String[],Integer>();
     
     
    String[] index  = new String[] {"a", "b"};
     
    test.put(index, 2);
    System.out.println(test.get(index )); // Renvoie 2 (bien)
    System.out.println(test.get(new String[] {"a", "b"})); // Renvoie null (pas bien)
    Je souhaiterais pouvoir récupérer la valeur '2' à partir de "a" et "b" uniquement (ie : sans passer par index).

    Comment puis-je faire ?

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour

    c'est normal, puisque en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(test.get(new String[] {"a", "b"}));
    et en particulier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new String[] {"a", "b"})
    tu fais référence à un nouvel objet et non pas à l'objet index que tu as déclaré auparavant

  3. #3
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Si tu as la possibilité de passer de String[] à String en utilisant un séparateur tu peux y arriver.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		Map<String,Integer> test = new Hashtable<String,Integer>();	
    		String index  = new String("a|b");
     
    		test.put(index, 2);
    		System.out.println(test.get(index)); // Renvoie 2 (bien)
    		System.out.println(test.get("a|b")); // Renvoie aussi 2 (bien)
    J'espère avoir pu t'aider.

    Billy

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Merci pour ta réponse.

    Je pensais cependant que la hashtable me permettait d'indexer en fonction de deux chaines de caractères et pas d'un objet ontenant deux chaines.

    J'ai bien compris que le problème était la référence à un objet, mais serait-il possible de récupérer l'entier '2' de mon exemple en utilisant uniquement "a" et "b" (en modifiant le put et/ou le get) ?

  5. #5
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Une solution serait alors de créer une nouvelle classe qui étend Hashtable et réécrire la méthode public synchronized Object get(Object key).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Il n'y a pas moyen de faire quelque chose d'équivalent à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Hashtable<String,Integer> test= new Hashtable<String,Integer>();
     
    String t = "ab";
    costs.put(t, 2);
    System.out.println(test.get("ab"));
    Dans cet exemple, je n'ai pas besoin de 't' pour utiliser le 'get'.

    Ce n'est pas aisément adaptable à un tableau de String ?

  7. #7
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    AutrePossibilité : créer une classe TableauDeString (je simplifie mais on pourrait passer par un type paramétré)
    un truc qui ressemblerait à ça :
    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
     
    class TableauDeString {
        String[] tb ;
       TableauDeString(String... args) {
          tb= args ;
       }
     
       public int hashCode() {
           return Arrays.hashCode(tb) ;
       }
     
       public boolean equals(Object ob) {
            if(! (ob instanceof TableauDeString)) return false ;
           TableauDeString autre = (TableauDeString) ob ;
            return Arrays.equals(tb, autre.tb) ;
       }
    }
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    monMap.put(new TableauDeString("a", "b"),2) ;
    String[] tab = {"c", "d"};
    monMap.put(new TableauDeString(tab), 77) ;
    ou quelque chose comme ça ...
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par SAKDOSS Voir le message
    Ce n'est pas aisément adaptable à un tableau de String ?
    Non. Mais ça marcherait avec une List<String>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hashtable<List<String>,Integer> test;
    et éventuellement se reposer sur Arrays.asList() si tu en as besoin.

    En résumé, le problème des tableaux c'est que leur hashCode ne veut rien dire. C'est différent avec les List.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Merci pour vos réponses.

    J'ai trouvé sur internet la classe MultiKey du package org.apache.commons.collections qui permet de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import java.util.HashMap;
    import org.apache.commons.collections.keyvalue.MultiKey;
     
    HashMap<MultiKey, Integer> map = new HashMap<MultiKey, Integer>();
    MultiKey multiKey = new MultiKey("a", "b");
    map.put(multiKey, 2);
     
     
    System.out.println(map.get(new MultiKey("a", "b")));

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Pour info, la clef d'une Map doit être un objet qui implémente correctement les méthodes hashCode()/equals() afin de pouvoir retrouver la clef facilement (Ce qui n'est pas le cas des tableaux en Java).

    De même la clef d'une Map devrait être une classe immuable, sous peine de casser complètement l'association entre la clef et sa valeur...


    a++

  11. #11
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    en complément du post précédent voici un extrait de la javadoc sur la hastable.. ils utilisent bien le terme must ...

    To successfully store and retrieve objects from a hashtable, the objects used as keys must implement the hashCode method and the equals method.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Merci pour ces précisions.

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

Discussions similaires

  1. utilisation d'une hashtable
    Par Methode dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 02/10/2007, 11h44
  2. Réponses: 1
    Dernier message: 27/09/2006, 16h21
  3. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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