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

Servlets/JSP Java Discussion :

Remplir une Hashtable


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut Remplir une Hashtable
    Bonjour,

    J'ai un soucis pour remplir une Hashtable!

    Mon code fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Hashtable table = new Hashtable(); 
     
    for(int i =0 ; i < 21 ; i++){ 
    table.put(i,liste[i]) //on imagine que liste est un tableau de 21 éléments ^^ 
    }
    Sauf que le remplissage ce fait comme suit:
    0,1,2,3,4,5,6,7,8,9,7,8,9,10,11,12,13,14,15,16,14


    Résultat au lieu d'avoir 21 valeurs j'en ai 16 dans ma Hashtable (qui a cependant une taille de 21...) et j'ai perdu les éléments 7,8,9,14 écrasé par les éléments 10,11,12,21...

    Et je comprends vraiment pas pourquoi ca fais ca, puisque chaque élément doit avoir une key différente ca devrait pas écraser les éléments déjà présent...

    Merci par avance de votre aide!

  2. #2
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    La suite de nombre correspond à quoi au juste ? aux clefs de ta hash ou est-ce les valeurs ?

    Et pour infos, tu as bien 21 valeurs, et non 16 comme tu nous l'indique
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    Je me suis mal exprimé désolé ^^

    La suite de chiffres correspond à la "case" de la hashtable dans laquelle chaque valeur est stocké!
    Donc on voit que 2 valeurs sont stockées dans les cases 7,8,9 et 14!

    On a donc un écrasement...

    Cette écrasement ce produit lorsque les clés sont des strings, si les clé sont des entiers de 1 à 21 la ca marche...


    Alors je comprend pas trop car tant que les clés sont différentes ca devrait fonctionner de la même manière non?

  4. #4
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    Lors du stockage d'une paire clé/valeur, l'objet représentant la clé est automatiquement soumise à la méthode hashCode() afin d'en récupérer un code de hachage identifiant d'une manière unique l'objet valeur. Ensuite, les codes de hachage sont comparés de telle sorte à vérifier si la clé est déjà présente dans la table de hachage. Si tel est le cas, la valeur donnée remplace l'ancienne.

    Es-tu sûr de ne pas avoir de doublon avec tes clefs ?

    Peux-tu nous donner ton code exact, avec les valeurs insérées dans ta Hash
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    Alors voilà le code (j'ai mis un tableau pour stocké les clés et vérifier que y'a pas de doublon):

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    BeanListeChamps loListeValChamps = new BeanListeChamps();
     
    		// Connexion à la base de données
    		Connection loConn = null;
    		// Instruction SQL
    		CallableStatement loStmt = null;
    		// Résultats de la requête
    		ResultSet loSet = null;
     
    		try {
    			// Obtention d'une connexion SQL
    			loConn = ServiceTech.moJdbcConnecteur.obtenirConnection();
    			ServiceTech.moServiceLog.debug("PS_WAM_LOAD_CHMP : obtenirConnection.");
     
    			/*
    			 * commit se fait automatiquement il faut donc desactiver ce mode
    			 * pour pouvoir faire un rollback();
    			 */
    			loConn.setAutoCommit(false);
     
    			// Préparation de la requête à exécuter
    			String lsSQL = "{ CALL PS_WAM_LOAD_CHMP(?) }";
     
    			loStmt = loConn.prepareCall(lsSQL);
     
    			// Valorisation des paramètres
    			loStmt.setString(NUM1, psCddorwam);
    			// Exécution de la requête
     
    			loSet = loStmt.executeQuery();
     
    			// On vérifie qu'il y ait un enregistrement correspondant
    			int lnNbLignes = 0;
    			//Création de l'objet PJ
     
    			ArrayList laListe = new ArrayList();
     
    			while (loSet.next()) {
     
    				lnNbLignes++;
     
    				laListe.add(loSet.getString(NUM2).trim());
     
    				ArrayList laListeKey = new ArrayList();
     
    				if (psCddorwam.equals(loSet.getString(NUM1).trim())) {
     
    					laListeKey.add(loSet.getString(NUM2).trim());
     
    					loListeValChamps.putChamp(loSet.getString(NUM2).trim(),
    							loSet.getString(NUM3).trim());
    				}
    			}
     
     
    			// On ferme l'objet SQL
    			loStmt.close();

    Voilà ce que j'ai en base donnée si j'exécute la procédure stocké que j'appel depuis mon assistant:
    1275470017301127.0.0.1 CDFRS 123456
    1275470017301127.0.0.1 CDMAG 42830
    1275470017301127.0.0.1 CDTYPMAG HYP_INT_G
    1275470017301127.0.0.1 CODEEAN1 0000000000066
    1275470017301127.0.0.1 COMMENTAIRE_OBL1 test XBR
    1275470017301127.0.0.1 DELAIANO1 dans moins de 5 jours
    1275470017301127.0.0.1 DESIGNATION1 test
    1275470017301127.0.0.1 EANINCONNU1 OUI
    1275470017301127.0.0.1 FAMILLE1 (01) 101 : BISCOTTES & ASSIMILES
    1275470017301127.0.0.1 LBANO Article inexistant en reconnaissance
    1275470017301127.0.0.1 LBCDTYPMAG Hypermarché intégré GOLD
    1275470017301127.0.0.1 LBFAM BISCOTTES & ASSIMILES
    1275470017301127.0.0.1 LBPRD test
    1275470017301127.0.0.1 NATANO1 Diffusion à venir
    1275470017301127.0.0.1 NBL 654321
    1275470017301127.0.0.1 NOMFRS BEI
    1275470017301127.0.0.1 NOMMAGASIN GEANT ST ETIENNE MONTHIEU
    1275470017301127.0.0.1 NUMFAM 101
    1275470017301127.0.0.1 NUMUE 01
    1275470017301127.0.0.1 PRESENCEMAILING1 NON
    1275470017301127.0.0.1 QUANTITE1 1


    Et voilà ce qu'il y'a dans la tableau laListe:
    CDFRS
    CDMAG
    CDTYPMAG
    CODEEAN1
    COMMENTAIRE_OBL1
    DELAIANO1
    DESIGNATION1
    EANINCONNU1
    FAMILLE1
    LBANO
    LBCDTYPMAG
    LBFAM
    LBPRD
    NATANO1
    NBL
    NOMFRS
    NOMMAGASIN
    NUMFAM
    NUMUE
    PRESENCEMAILING1
    QUANTITE1



    Et avec tout ca, laListeValeurChamp a une taille de 21 mais ne contient que 16 valeurs!!

    J'espère que j'ai tout mis cette fois ^^

    Merci de ton aide!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    J'ai oublié de mettre le code de la classe BeanListeChamps():

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public class BeanListeChamps {
     
    	/** intialisation des variables static* */
    	private final static int NUM1 = 1;
     
    	private final static int NUM2 = 2;
     
    	private final static int NUM3 = 3;
     
    	// déclaration de la variable pour la liste des champs
    	private Hashtable moListeChamps;
     
    	/**
    	 * constructeur de la classe
    	 */
     
    	public BeanListeChamps() {
    		this.moListeChamps = new Hashtable();
    	}
     
    	/**
    	 * Ajoute champ et sa valeur dans la table de hachage
    	 *  
    	 */
    	public void putChamp(Object poKey, Object poValue) {
    		moListeChamps.put(poKey, poValue);
    	}
     
    	public boolean containsKey(Object poKey) {
    		return moListeChamps.containsKey(poKey);
    	}
     
    	/**
    	 * renvoie la valeur de la clé=nom du champ
    	 */
    	public String getValueChamp(Object poKey) {
    		return (String) moListeChamps.get(poKey);
    	}
     
    	/**
    	 * renvoie le nombre d'elements de la liste des Champss
    	 */
    	public int taille() {
     
    		return moListeChamps.size();
    	}
     
    	/**
    	 * methode testant si la clé (le champ) est dans la table
    	 */
     
    	public boolean existChamp(Object poKey) {
     
    		return moListeChamps.containsKey(poKey);
     
    	}

    Et j'ai aussi rajouté un tableau de booleen et j'ai testé dans la boucle de remplissage à chaque tour si la clé que je voulais insérer existait déjà dans la Hashtable, résutlat 21 false dans le tableau...
    Du coup je comprend vraiment pas :/

  7. #7
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    J'ai du mal à bien saisir.

    Dans "laListe" on retrouve bien la série de valeur (en l'occurrence les clefs de ta Hash) qui te sont retournées par ta requête en base.

    Par quel code obtiens-tu cette suite :
    0,1,2,3,4,5,6,7,8,9,7,8,9,10,11,12,13,14,15,16,14
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    En fait cela n'est pas une suite que j'obtiens! On va faire un truc, oublie cette suite ^^

    Dans la liste je retrouve bien toute les clés, mais dans la Hashtable elle ne sont pas toutes présentes, et c'est là le problème!

  9. #9
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    Dans "laListeKey" tu as la même chose que dans "laListe" ?
    as-tu essayé d'insérer dans une Hashtable sans passer par ta classe BeanListeChamps ?
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    J'ai la même chose dans listeKey oui!
    Et j'ai également essayé directement par une HashTable sans passer par la classe BeanListeChamp(je comprend pas son utilité d'ailleurs m'enfin ...)
    Et ca ne marche pas non plus!

  11. #11
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    Essayes ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (psCddorwam.equals(loSet.getString(NUM1).trim())) {
    	String num2 = (String) loSet.getString(NUM2).trim();
            String num3 = (String) loSet.getString(NUM3).trim();
    	loListeValChamps.putChamp(num2,	num3);
     
    				}
    ou alors ceci :
    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
     
    List lKeys = new ArrayList();
    List lValues = new ArrayList();
    while (loSet.next()) { 					
     
    	if (psCddorwam.equals(loSet.getString(NUM1).trim())) {
     
    		lKeys.add(loSet.getString(NUM2).trim());
                    lValues.add(loSet.getString(NUM3).trim());
    	}
    }
     
    Hashtable hResult = new Hashtable();
    for(int i = 0; i < lKeys.size(); i++){
         hResult.put(lKeys.get(i), lValues.get(i));
    }
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    Toujours le même résultat...
    Pourtant dans ta deuxième proposition, les listes lKey et lValues contiennent chacune les 21 valeurs ainsi que les 21 clés dans le bon ordre!
    Mais sustématiquement au moment du remplissage de la Hashtable le même problème reviens :/

  13. #13
    Membre actif Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Points : 241
    Points
    241
    Par défaut
    Question : As-tu besoin d'utiliser une map synchronisée ? Si non il conviendrait d'avantage que tu utilises une HashMap
    Non l'homme ne descend pas du singe, il descend plutôt du mouton..

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 10
    Points
    10
    Par défaut
    Bon j'ai la "Solution"...
    Le debugger d'Eclipse c'est de la merde!
    Il ne m'affiche que 16 valeurs dans ma Hashtable alors qu'il y'en a bien 21...
    Désolé de t'avoir fais perdre ton temps et merci pr ton aide!

Discussions similaires

  1. [JSP][STRUTS]Cle d'une hashtable
    Par julienOriano dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/06/2004, 13h47
  2. Remplir une grosse BdD ??
    Par MagicManu dans le forum Outils
    Réponses: 2
    Dernier message: 15/06/2004, 15h01
  3. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33
  4. remplir une table avec UTL_FILE.GET_LINE
    Par delphim dans le forum SQL
    Réponses: 9
    Dernier message: 12/03/2004, 10h15

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