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 :

Bonne utilisation des ArrayList et Hashtable?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut Bonne utilisation des ArrayList et Hashtable?
    Bonjour,
    j'ai un souci avec l'utilisation des Hashtable et des ArrayList :
    Tout se passe bien dans une boucle, je vérifie les résultats à l'aide de System?out.println(), et lorsque je sors de la boucle, ces affichages ne correspondent plus...

    Plutôt que d'expliquer mon problème avec un long bloc, je vous propose mon code commenté.

    PS: j'ai tout placé dans une petite classe main afin d'identifier le problème

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    	static Properties prop = new Properties();
     
    	private static void chargerProp(String nomFichier) {
    		try {
    			FileInputStream in = new FileInputStream(nomFichier);
    			prop.load(in);
    			in.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static void main(String[] args) {
     
    		String[] nomFichierSansExtension;
    		String valeur;
    		ArrayList<Fichier> al = new ArrayList<Fichier>();
    		String[] tab = { "toto.cfg", "titi.cfg" };
    		Hashtable<String, String> ht = new Hashtable<String, String>();
    		String elements[];
    		for (int i = 0; i < tab.length; i++) {
    			// on obtient toto par exemple
    			nomFichierSansExtension = tab[i].split("\\.");
    			// lecture des éléments à chercher dans un fichier
    			chargerProp("donnees.properties");
    			elements = prop.getProperty(nomFichierSansExtension[0]).split(";");
    			chargerProp(tab[i]);
    			ht.clear();
    			for (String str : elements) {
    				valeur = prop.getProperty(str);
    				ht.put(str, valeur);
    			}
    			//ici, hashtable donne ce que j'attend
    			System.out.println(ht.toString());
    			al.add(new Fichier(tab[i], ht));
                            //et l'arraylist aussi
    			System.out.println(al.get(i).toString());
    		}
    		//la ,j'obtiens toujours la dernière valeur du hashtable, alors que le nom change bien.
    		for (int i = 0; i < al.size(); i++) {
    			System.out.println(al.get(i).getNom());
    			System.out.println(al.get(i).getDonnees().toString());
    		}
    	}
    Ca fait un petit moment que je rame dessus, et j'ai eu beau multiplier les tests, je ne trouve pas mon erreur...

    Arrivez-vous à voir où se situe mon problème?

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu efface ta hashtable à chaque itération de la boucle, mais c'est la même hashtable que tu met à chaque index de ta liste. donc de fait, ca ne contient que la dernière boucle.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Merci
    Comment faire alors? Une new Hashtable() dans la boucle?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Pourtant, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.out.println(al.get(i).toString());
    Ca m'affiche la bonne valeur!
    C'est seulement quand je sors de mon deuxième for que cette valeur est modifiée.
    Or, c'est le seul endroit ou je touche à mon arrayList...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    Il suffit, semble t-il, de créer la HashTable à chaque itération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void main(String[] args) {
     
    		String[] nomFichierSansExtension;
    		String valeur;
    		ArrayList<Fichier> al = new ArrayList<Fichier>();
    		String[] tab = { "toto.cfg", "titi.cfg" };
    		String elements[];
    		for (int i = 0; i < tab.length; i++) {
                           Hashtable<String, String> ht = new Hashtable<String, String>();
                           [...]
    et de sortir le clear()

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par floctc Voir le message
    Pourtant, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     System.out.println(al.get(i).toString());
    Ca m'affiche la bonne valeur
    Ca t'affiche la dernière itération en date, oui. Comme dit, créer un nouveau hashtable à chaque fois, sinon c'est le même qui sera partagé par tous les index.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Par défaut
    Merci, j'y vois plus clair.
    Par contre, comment faire pour ajouter ma Hashtable dans mon ArrayList une fois sorti de la boucle?
    Comme c'est une variable locale à la boucle, lorsque j'en sors, elle n'existe plus

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

Discussions similaires

  1. bonne utilisation des alias
    Par gok6tm dans le forum Requêtes
    Réponses: 0
    Dernier message: 15/11/2007, 11h48
  2. [C#]Méthode utilisant des arraylist
    Par Cyriusix dans le forum Accès aux données
    Réponses: 6
    Dernier message: 04/05/2007, 09h44
  3. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 20h07
  4. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/2005, 11h39

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