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

Langage Java Discussion :

Hashtable dans une boucle for


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Hashtable dans une boucle for
    Bonjour,

    J'ai un souci dans un code (java évidemment)

    Je veux créer une hashtable de listes.
    Cette table est remplie dans une boucle.
    Or, le 'put' ne s'exécute, apparemment qu'en fin de cycle avec la dernière liste créée.

    Voici mes déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private Hashtable<Integer,Object> ht = new Hashtable<Integer,Object>();
    	private ArrayList<String> liste = new ArrayList<String>();
    	private Integer i;
    je lance ma boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for (i=1; i<20; i++)
            {
                    liste.clear();
            	liste.add(String.valueOf(i));
            	liste.add(String.valueOf(2*i));
            	liste.add(String.valueOf(2*i+1));
            	ht.put(i, liste);
            }
    je devrais obtenir :
    {1=[1, 2, 3]
    2=[2, 4, 5]
    3=[3, 6, 7]
    ...
    19=[19, 38, 39]}
    mais j'obtiens :

    19={[19, 38, 39],
    18=[19, 38, 39],
    17=[19, 38, 39],
    ...
    1=[19, 38, 39]}
    Qu'est-ce que je ne fais pas bien ?

    Merci d'avance pour vos pistes.

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Java n'a pas de sémantique de valeurs, ce n'est donc pas une copie que tu mets dans ta table de hachage, c'est une référence, donc tu modifies la référence toutes les itérations et toutes les cases du tableau de hachage possèdent la même référence.

    Il faut que tu crées la liste dans la boucle et non en dehors en faisant un clear().

  3. #3
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Normal.

    Je pense que tu voulais faire ça plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Map<Integer, List<String>> multimap = new HashMap<.....
     
    private List<String> createList(Integer nb) {
      final List<String> result = new ArrayList<String>(3);
      result.add("" + nb); // je sais c'est moche
      result.add("" + (2 * nb) );
      result.add("" + (2 * nb + 1) );
      return result;
    }
     
    for (i=1; i<20; i++) {
      multimap.put(i, createList(i);
    }
    Pas besoin de faire de clean dans cet algo.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci Baptiste,

    Il m'a fallu relire le message deux trois fois pour comprendre, mais, au moins, j'ai appris !

    J'ai modifié ma boucle qui est devenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i=1; i<20; i++)
    {
    ArrayList<String> liste = new ArrayList<String>();
    liste.add(String.valueOf(i));
    liste.add(String.valueOf(2*i));
    liste.add(String.valueOf(2*i+1));
    ht.put(i, liste);
    }
    Et ça marche nickel (en tous cas, ça donne ce que je veux)

    Merci aussi à Thierryler pour cette utilisation de hashmap (que je maitrise encore moins que la hashtable).
    Je préfère utilise le valueOf, je trouve assez moche l'astuce du ""+ ...
    Je note précieusement dans mes tablettes.

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Je confirme que ma construction des strings et moche. En même temps pourquoi tu stoïques des strings et pas directement des integers?

    N'oublie pas les final.

    Pour info, ce que tu essaie de faire, ie. Une map de list, ça s'appelle une multimap.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

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

Discussions similaires

  1. multi ouverture de la console dans une boucle for
    Par jamesleouf dans le forum C++
    Réponses: 2
    Dernier message: 16/03/2006, 21h26
  2. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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