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 :

Hashtable la clef ne donne pas l'object


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut Hashtable la clef ne donne pas l'object
    Mon code fonctionne bien sans l’enregistrement, c’est l’hors de l’évolution qu’il me pose problème.

    J’ai fait des trais et des dessins que j’ai appeler «*forme*» , ils sont sur plusieurs feuille mais tous enregistrés dans un même Hashtable que seul la clef différencie.
    Six feuilles donc
    les clef de 0 a 5 représentent les feuilles, leurs objet est le nombre de formes de chaque feuille.
    La clef 1.1 est le première forme de la feuille 1,
    La clef 1.2 la seconde ect…
    La clef 2.1 est le première forme de la feuille 2
    ect…

    J’ai enregistrer les formes dans un fichier texte, je les extrait sans problème.

    Que je passe le Hashtable par référence ou que je les copie d’un Hashtable passer par valeur ne change rien.

    Le problème viens quand je veux utiliser le Hashtable , sur le débogueur je retrouve toutes mes formes mais la clef ne me permet pas de récupérer l’objet.

    Je suis dépasser je ne comprend pas, si quelqu’un pouvait me dire quel est le problème et me donner une solution.

    Le code d’enregistrement et de récupération des formes

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
     
    package en_forme;
     
    import java.io.*;
    import java.util.*;
    import javax.swing.*;
    /**
     *
     * @author Janosor
     */
    public class Enregistrement_forme
    {
     
     
        public void enregistrer (Hashtable hash_forme)
        {
                ouvrire(hash_forme);
        }
     
        public Hashtable extraction()
        {
            Hashtable hash_forme = new Hashtable();
            String str_clef = "";
            String str_forme = "";
            Stocage sto_tirrage = new Stocage();
     
     
            try
            {
                String str_nom = "C:/..…./formes.txt";
                FileReader fred_nom_fichier = new FileReader(str_nom);
                BufferedReader buf_wrt_forme = new BufferedReader (fred_nom_fichier);
     
     
                do
                {
                    str_clef = buf_wrt_forme.readLine();
                    str_forme = buf_wrt_forme.readLine();
     
                    hash_forme.put(str_clef,str_forme );
                }while (buf_wrt_forme.ready() );//boo_fin != true);
                buf_wrt_forme.close();
            }
     
     
            catch (EOFException e)
            {
                    message_erreur( "EOF Exception" + e);
            }
            catch(java.io.IOError e)
            {
                message_erreur( "IOErreur" + e);
            }
            catch (java.io.IOException e)
            {
                message_erreur(" IOExeption" + e);
            }
            finally
            {
                   //message_erreur (" finally");
            }
            return (hash_forme);
        }
     
        private void ouvrire(Hashtable hash_forme)//enregistrement
        {
            try
            {
                String fr_nom = "C:/……/formes.txt";
                FileWriter fwrt_nom_fichier = new java.io.FileWriter(fr_nom);
                BufferedWriter buf_wrt_forme = new BufferedWriter (fwrt_nom_fichier);
     
                Iterator toutes_clef;
                Iterator toutes_formes;
     
                toutes_clef = (Iterator)hash_forme.keys();
                toutes_formes = (Iterator)hash_forme.elements();
     
                while ( (toutes_clef.hasNext()) && (toutes_formes.hasNext()))
                {
                    buf_wrt_forme.write(String.valueOf(toutes_clef.next()));
                    buf_wrt_forme.newLine();
                    buf_wrt_forme.write(String.valueOf(toutes_formes.next()));
                    buf_wrt_forme.newLine();
                }
                buf_wrt_forme.close();
            }
            catch (EOFException e)
            {
                    message_erreur( "EOF Exception" + e);
            }
            catch(java.io.IOError e)
            {
                message_erreur( "IOErreur" + e);
            }
            catch (java.io.IOException e)
            {
                message_erreur(" IOExeption" + e);
            }
            finally
            {
                   //message_erreur (" finally");
            }
        }
     
     
     
        private void message_erreur(String str_erreur)
        {
            javax.swing.JFrame Jfr_erreur = new JFrame("Erreur dans extraxion");
            Jfr_erreur.setBounds(100, 100, 300, 200);
     
            javax.swing.JTextArea Jtxt_erreur = new JTextArea();
            Jtxt_erreur.setText(str_erreur);
            Jtxt_erreur.setBounds(20, 20, 200, 100);
     
            Jfr_erreur.add(Jtxt_erreur);
            Jfr_erreur.setEnabled(true);
            Jfr_erreur.setVisible(true);
     
        }
     
    }
    Code d’utilisation des formes réduit a la portion ou le hachtable est utilisé.

    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
     
     
     
                //Le hach_forme donne un objet qu’il faut convertir en String, pour le convertir en int après
                String str_nb_f = String.valueOf(hash_forme.get(int_num));
    //L’érreure se voie ici car str_nb_f a la valleur null alors que le Hashtable est correcte.
                int int_compte_forme = Integer.parseInt(str_nb_f);
     
    //dessin de forme
                if (int_compte_forme >=1)
                {
                    //str_clef = (String.valueOf(int_num)+"."+String.valueOf(int_nb_formes[int_num]));
                    //hash_forme.put(str_clef, new String(str_forme));
                    //int_nb_formes[int_num]++;
                    //hash_forme.put(int_num, int_compte_forme);
     
     
                    for (int j = 0; j<=int_compte_forme-1;j++)
                    {
                        String clef = (int_num + "." + (j));
                        String str_poly_forme = String.valueOf(hash_forme.get(clef));
                        int int_longueur = str_poly_forme.length();
                        int int_pt_n = str_poly_forme.lastIndexOf("n");
                        int int_nb_pt = Integer.parseInt(str_poly_forme.substring((int_pt_n +1), int_longueur));
                        int []tab_int_x = new int[int_nb_pt];
                        int []tab_int_y = new int[int_nb_pt];
                        int int_position_x = 0;
                        int int_position_y = 0;
                        int int_position_virgule=0;
                        String str_x;
                        String str_y;
                        for ( int i = 1; i<= int_nb_pt;i++)
                        {
                            int_position_x =(str_poly_forme.indexOf("x", int_position_y));
                            int_position_y = (str_poly_forme.indexOf("y", int_position_x));
                            int_position_virgule = (str_poly_forme.indexOf(",", int_position_y));
                            str_x = str_poly_forme.substring(int_position_x+1, int_position_y);
                            str_y = str_poly_forme.substring(int_position_y+1, int_position_virgule);
                            tab_int_x[i-1] = Integer.parseInt(str_x);
                            tab_int_y[i-1] = Integer.parseInt(str_y);
     
                        }
                        g.setColor(Color.red);
                        //g.drawPolygon(tab_int_x, tab_int_y, int_nb_pt);
                        g.fillPolygon(tab_int_x, tab_int_y, int_nb_pt);
                    }
    Au départ j’avais fait sa par valeur mais j’avais le même problème, putAll() fonctionnait très bien aussi que je caste ou pas le Map, mais actuellement il n’est pas ulilisé.



    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
     
     
    public void set_hash(Hashtable hash_fo)
        {
            //hash_forme.putAll((Map)hash_fo);
            Iterator toutes_clef;
            Iterator toutes_formes;
     
     
            toutes_clef = (Iterator)hash_fo.keys();
            toutes_formes = (Iterator)hash_fo.elements();
     
            while ( (toutes_clef.hasNext()) && (toutes_formes.hasNext()))
            {
     
                hash_forme.put(String.valueOf(toutes_clef.next()), String.valueOf(toutes_formes.next()));
            }
     
        }

    J’ai tracer le problème jusqu’à class Hashtable qui ici me renvoi null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public synchronized V get(Object key) {
    	Entry tab[] = table;
    	int hash = key.hashCode();
    	int index = (hash & 0x7FFFFFFF) % tab.length;
    	for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
    	    if ((e.hash == hash) && e.key.equals(key)) {
    		return e.value;
    	    }
    	}
    	return null;
        }

    Merci d'avance a tout ceux qui vont prendre du temps pour mon problème.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Bonjour,

    bon, en espérant ne pas dire trop de bétises :

    Tu remplis ton Hash_forme avec cette méthode :
    hash_forme.put(str_clef,str_forme );

    Et tu récupère les infos avec :
    String str_nb_f = String.valueOf(hash_forme.get(int_num));

    N'aurais tu pas un problème de type de variable ?
    Tu dépose une clef en String et tu demandes une recherche d'une clef int ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    int_num est la feuille que je veux afficher.

    Le hachetable me retourne une variable objet qui représente le nombre de formes dans la feuille et que je transforme en String.
    A la ligne suivante je la transforme en int afin de tester si il y a des formes.

    Mais tu me donne une idée, je ne suis pas super calé mais j'ai déjà eu un problème ou les itérations me rendaient toujours la même variable sa venait du fait que je passait toujours une adresse de variable au lieux de la valeur.
    Il suffi de placer new les chaque enregistrement.
    Je vais voir si sa marche.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    J'ai trouver, je ne pensais pas que le Hashtable était sensible au type de données dans la clef.
    Comme elle est entrée comme String je doit aller la chercher en String.

    Voila sa marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String str_clef = String.valueOf(int_num);
    Object obj_form = hash_forme.get(str_clef);
    String str_nb_f =  String.valueOf(obj_form);
    Merci a toi Caalador ta question m'a mis la puce a l'oreille.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Points : 422
    Points
    422
    Par défaut
    Pas de problème.
    Par contre, tu devrais pouvoir écrire ton code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String str_nb_f = (String)hash_fome.get(int_num+"");
     
    // (String) permet de "transformer" directement ton Objet en String
    // et additionner une chaine de caractère à un variable de type int permet de "transformer" ton int en chaine de caractère.
    // ex. : 1+1 = 2 alors que "1"+1 = "11"
    // du coup int_num+"" = "int_num"

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Je n'avais pas relu ta première réponse, c'est bien toi qui avait trouver en premier.

    Le cast ne fonctionne pas toujours, j'ai dans se même programme un vecteur de groupes de points qui compte plus de 350 entrées et a force de le manipuler j'ai trouver plusieurs cas ou le compilateur refuse le cast c'est pour sa que j'utilise String.valueOf(), Integer.parseInt() et quelques autres occasionnellement.

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

Discussions similaires

  1. [C#/DataView] Pourquoi mon tri ne donne pas le resultat escompté ?
    Par Low-Fi dans le forum Accès aux données
    Réponses: 1
    Dernier message: 12/08/2006, 22h15
  2. Concaténation ne donne pas le résultat attendu
    Par artotal dans le forum Langage
    Réponses: 4
    Dernier message: 12/05/2006, 01h37
  3. Réponses: 11
    Dernier message: 04/05/2006, 11h50
  4. ensemble de données pas en mode edition
    Par XloX dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/06/2005, 12h17
  5. Rnd qui ne donne pas que des bonnes valeurs
    Par kubito dans le forum Access
    Réponses: 2
    Dernier message: 08/10/2004, 18h00

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