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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    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 émérite 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
    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 chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    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 chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    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 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
    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 ...

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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

+ 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