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

Entrée/Sortie Java Discussion :

Remplir une matrice à partir d'un fichier


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut Remplir une matrice à partir d'un fichier
    Bonsoir tout le monde ,

    Je suis entrain de developper la méthode de calcul de cosinus dans l'espace vectoriel , en fait à ce niveau lâ je programme une méthode qui accepte comme paramêtres deux fichiers en mode lecture et une martice à remplir. D'ou je vais remplir ma matrice par ces deux fichiers. Sauf que mes fichiers ont la structure suivante : mot de 3 caractère + deux points + entier, exemple ---> abc:25

    Pourriez vous m'aider à réaliser ce traitement ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void remplissage(BufferedReader f1,BufferedReader f2 ,String[][] matrice ) throws IOException
    { 
        String c = null;
             while ((c = f1.readLine()) != null) {
                String[] ligne = c.split(":");
                String gram=ligne[0];
                int Fq = Integer.parseInt(ligne[1]);
               // Je vousdrais remplair les cases de la matrice
     
            }
    }
    Ma matrice resultat devient être comme suit :

    abc 12 0
    bfj 26 0
    hdy 2 5
    hdt 12 2
    ghu 0 152


    Aidez-moi s'il vous plaît

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Par défaut
    Bonjour,

    La matrice est censée contenir uniquement des String donc il faudra parse les entiers de chaque ligne.

    Pour le remplissage, à vue de nez, si j'essaye de m'adapter à ce qui a déjà été fait, je mettrais les lignes suivantes dans le while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0; i < matrice.length; i++) {
        String[] ligne = c.split(":");
        matrice[i][0] = ligne[0];
        matrice[i][1] = ligne[1];
        matrice[i][2] = ligne[2];
    }

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Bonjour,
    Déjà, on ne va pas faire le boulo à ta place !
    tu n'explique pas assez ce que tu veux faire, mais si je ne me trompe pas, les valeurs de la colonne 2 viens du fichier 1 et les valeurs de la colonne 3 du fichier 2 ?

    Premièrement, as tu vraiment besoin de faire un tableau, ou tu peux utiliser autre chose comme structure ?
    Ton problème dans un premier temps est que tu es incapable de connaître le nombre de ligne sans avoir parcouru l'ensemble de tes fichiers !
    Le deuxième problème est que si 'abc' existe dans les deux fichiers alors tu dois pouvoir le rechercher pour mettre sa deuxième valeur !

    Conclusion l'utilisation d'une Collection tel qu'une Map serait plutôt adapter !

    Maintenant, il faut voir ce que tu va mettre comme values dans la Map !
    Si tu n'as pas vraiment besoin d'une matrice alors pourquoi ne pas créer un objet qui contiendra tes valeurs et ta chaine qui il me semble correspondra à ton angle et tu pourra y ajouter la méthode qui te retournera le cosinus.

    Si tu a vraiment besoin d'une matrice alors, tu y met un tableau a 3 éléments et ensuite tu reconstruis ta matrice lorsque tu as toute les valeurs.

    Pour finir, il n'est pas utile de passer la matrice à la méthode remplissage car tu ne peux pas connaître sa taille avant d'avoir lu les fichiers !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Bonjour,

    Je vous remercie pour votre réponses.

    En fait j'ai deux fichiers (f1 et f2) chaque ligne de ces deux derniers a la structure --> mot : entier , par exemple abc:15 , dans le même fichier ce mot est unique (c_à-d je peux pas trouver encore un abc:entier) par contre dans f2 je peux y trouver.

    En fait je suis un peu hésitée pour le choix de la structure de données matrice , et comme première impression je trouve que celle la plus adaptable pour ensuite comparer deux vecteurs.

    A ce niveau la Je pense à:
    1) Remplir la matrice M par toutes les lignes du fichier f1 (vue qu'il y a pas de redandance des lignes et vu aussi que le f1 a la plus grande taille) {f1: 7702 lignes et f2: 6017}
    Normalement ma matrice sera formée par (7702+6017) lignes et 3 colonnes (colonne 1 contient le mot - colonne 2 contient la fq du mot dans f1 - colonne 3 contient la fq du mot dans f2)

    un petit exemple :
    abc 15 0
    sgh 6 0
    g3_ 3 0
    .... (jusqu'à la fin fichier f1)

    2) Parcourir la matrice déja remplie, et ouvrir le ficher f2 en mode écriture. Quand je trouve un mot de matrice existe dans le f2 , j'ajoute la frq de ce mot dans la 3 éme colonne.
    Exemple si je trouve (abc:3) dans f2 . au niveau de la matrice je change : abc 15 3 .
    Sinon j'ajoute ce nouveau mot au desous de la matrice par exemple pour (ddc:4), au niveau de la matrice je change : ddc 0 4
    et je supprime cette ligne dans f2. Dés que j'atteinds la fin de M , j'ajoute le reste de mon fichier f2 au desous de M.

    D'ou la matrice resultat :
    abc 15 3
    sgh 6 0
    g3_ 3 0
    ddc 0 4

    J'éspère que j'ai bien expliquer le cas.

    1) j'essaye pour l'instant e remplir la matrice par les ligne du fichier f1

    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
    public static void remplissage(BufferedReader f1,BufferedReader f2) throws IOException
    {   String[][] matrice = new String [10000][3];
        String c = null;
     
             while ((c = f1.readLine()) != null) {
                 //System.out.println(c);
                String[] ligne = c.split(":");
                String gram=ligne[0];
                String fq = ligne[1];
                 for(int i = 0; i < 10000; i++){
                 for(int j = 0; j <3; j++){
                     matrice[i][0]=gram;
                     matrice[i][1]=fq;
                     matrice[i][2]="0";
                }}
              }
     
     
     
     
              //affichage matrice
             for(int i = 0; i < matrice.length; i++){
                for(int j = 0; j < matrice[i].length; j++){
                    System.out.print(matrice[i][j] + " ");
                }
                System.out.println();
            }
     
     
    }
    Le problème c'est que l'insertion dans la matrice prend en charge sauf la dernière ligne du fichier

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par cheyma Voir le message
    A ce niveau la Je pense à:
    1) Remplir la matrice M par toutes les lignes du fichier f1 (vue qu'il y a pas de redandance des lignes et vu aussi que le f1 a la plus grande taille) {f1: 7702 lignes et f2: 6017}
    Normalement ma matrice sera formée par (7702+6017) lignes et 3 colonnes (colonne 1 contient le mot - colonne 2 contient la fq du mot dans f1 - colonne 3 contient la fq du mot dans f2)

    un petit exemple :
    abc 15 0
    sgh 6 0
    g3_ 3 0
    .... (jusqu'à la fin fichier f1)

    2) Parcourir la matrice déja remplie, et ouvrir le ficher f2 en mode écriture. Quand je trouve un mot de matrice existe dans le f2 , j'ajoute ce la frq dans le 3eme colonne Exemple si je trouve (abc:3) dans f2 . au niveau de la matrice je change : abc 15 3 .
    Sinon j'ajoute ce nouveau mot au desous de la matrice par exemple pour (ddc:4), au niveau de la matrice je change : ddc 0 4

    D'ou la matrice resultat :
    abc 15 3
    sgh 6 0
    g3_ 3 0
    ddc 0 4
    C'est exactement ce que j'avais compris et que j'ai décris dans mon poste !

    Citation Envoyé par cheyma Voir le message
    En fait je suis un peu hésitée pour le choix de la structure de données matrice , et comme première impression je trouve que celle la plus adaptable pour ensuite comparer deux vecteurs.
    Comme je te l'ai indiqué précédemment, ton problème principal avec un tableau c'est que tu ne connais pas sa taille avant d'avoir lu les fichiers car un tableau a deux dimension comme le tiens tu dois pour l'initialiser :
    • indiquer le nombre de ligne et dans ton cas tu ne le connais pas et donc tu mets une valeur au hasard
    • indiquer le nombre de colonne et dans ton cas c'est 3


    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
    public static void remplissage(BufferedReader f1,BufferedReader f2) throws IOException
    {   String[][] matrice = new String [10000][3]; // Et oui une valeur au hasard !!!
        String c = null;
     
             while ((c = f1.readLine()) != null) {
                 //System.out.println(c);
                String[] ligne = c.split(":");
                String gram=ligne[0];
                String fq = ligne[1];
                 for(int i = 0; i < 10000; i++){  // la tu va ecraser toute les valeurs avec la dernière ligne lu !
                 for(int j = 0; j <3; j++){ // et une boucle qui ne sert a rien car tu écrases 3 fois les mêmes cellule
                     matrice[i][0]=gram;
                     matrice[i][1]=fq;
                     matrice[i][2]="0";
                }}
              }
    }
    je maintiens donc qu'une Map est plus adaptée pour charger tes fichiers.
    Tu commence par créer un objet qui va contenir tes 3 données par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Datas {
      private String gram;
      private int fq1;
      private int fq2;
        .... // les getter et setter
    }
    et une Map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, Datas> matrice = new HashMap<String, Datas>();
    et ensuite tu insert tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Datas datas = matrice.get(ligne[0]);
      if (datas != null) {
        datas.setFq1(Integer.parseInt(ligne[1])); // dans le cas du 2eme fichier il faut affecter fq2
      } else {
        Datas newDatas = new Datas();
        newDatas.setGram(ligne[0]);
        newDatas.setFq1(Integer.parseInt(ligne[1]));// dans le cas du 2eme fichier il faut affecter fq2
        matrice.put(ligne[0], newDatas);
      }
    en plus cela va fonctionner pour les deux fichiers !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Bonjour ,

    Merci Alkhan ,

    j'ai suivie ce que vous m'avez proposé

    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
     public static Map<String, Matrice> remplissageDuFichDT(BufferedReader f1) throws IOException {
     
            Map<String, Matrice> mat = new HashMap<String, Matrice>();
            String c = null;
     
            while ((c = f1.readLine()) != null) {
                String[] ligne = c.split(":");
                Matrice m = mat.get(ligne[0]);
                if (m != null) {
                    m.setFq1(Integer.parseInt(ligne[1])); // dans le cas du 2eme fichier il faut affecter fq2
                } else {
                    Matrice newMatrice = new Matrice();
                    newMatrice.setGram(ligne[0]);
                    newMatrice.setFq1(Integer.parseInt(ligne[1]));// dans le cas du 2eme fichier il faut affecter fq2
                    newMatrice.setFq2(0);
                    mat.put(ligne[0], newMatrice);
                }
     
            }
     
            // Afficher le contenu du MAP
            Set listKeys = mat.keySet();  // Obtenir la liste des clés
            Iterator iterateur = listKeys.iterator();
            // Parcourir les clés et afficher les entrées de chaque clé;
            while (iterateur.hasNext()) {
                Object key = iterateur.next();
                System.out.println(key + "\t" + mat.get(key));
            }
         return mat;
        }
    Nom : Capture.PNG
Affichages : 2525
Taille : 2,9 Ko

    Le nombre de fréquence ne s'affiche pas correctement . Merci de m'aider

  7. #7
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Je corrige, en fait ma faute c'est au niveau de l'affichage du map

    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
    public static Map<String, Matrice> remplissageDuFichDT(BufferedReader f1) throws IOException {
     
            Map<String, Matrice> mat = new HashMap<String, Matrice>();
            String c = null;
     
            while ((c = f1.readLine()) != null) {
                String[] ligne = c.split(":");
                Matrice m = mat.get(ligne[0]);
                if (m != null) {
                    m.setFq1(Integer.parseInt(ligne[1])); // dans le cas du 2eme fichier il faut affecter fq2
                } else {
                    Matrice newMatrice = new Matrice();
                    newMatrice.setGram(ligne[0]);
                    newMatrice.setFq1(Integer.parseInt(ligne[1]));// dans le cas du 2eme fichier il faut affecter fq2
                    newMatrice.setFq2(0);
                    mat.put(ligne[0], newMatrice);
                    System.out.println(newMatrice.getGram()+"\t"+newMatrice.getFq1()+"\t"+ newMatrice.getFq2());
     
                }
            }
         return mat;
        }
    J'essaye d'avancer au niveau du traitement afin de développer toute l'apprcohe de calcul de cosinus
    Merci de m'avoir aider

  8. #8
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    Citation Envoyé par cheyma Voir le message
    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
    public static Map<String, Matrice> remplissageDuFichDT(BufferedReader f1) throws IOException {
     
            Map<String, Matrice> mat = new HashMap<String, Matrice>();
            String c = null;
     
            while ((c = f1.readLine()) != null) {
                String[] ligne = c.split(":");
                Matrice m = mat.get(ligne[0]);
                if (m != null) {
                    m.setFq1(Integer.parseInt(ligne[1])); // dans le cas du 2eme fichier il faut affecter fq2
                } else {
                    Matrice newMatrice = new Matrice();
                    newMatrice.setGram(ligne[0]);
                    newMatrice.setFq1(Integer.parseInt(ligne[1]));// dans le cas du 2eme fichier il faut affecter fq2
                    newMatrice.setFq2(0);
                    mat.put(ligne[0], newMatrice);
                    System.out.println(newMatrice.getGram()+"\t"+newMatrice.getFq1()+"\t"+ newMatrice.getFq2());
     
                }
            }
         return mat;
        }
    Attention car en mettant le System.out a cette endroit, tu n'aura pas toute les valeurs dans le résultat !

    Reprenons ton code précédent.....
    Citation Envoyé par cheyma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            // Afficher le contenu du MAP
            Set listKeys = mat.keySet();  // Obtenir la liste des clés
            Iterator iterateur = listKeys.iterator();
            // Parcourir les clés et afficher les entrées de chaque clé;
            while (iterateur.hasNext()) {
                Object key = iterateur.next();
                System.out.println(key + "\t" + mat.get(key));
            }
         return mat;
        }
    dans ce code tu récupères mal les données de la MAP. En effet, tu peux parcourir directement les valeurs sans les clés ce qui donnerait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Collection<Matrice> listKeys = mat.values(); // Obtenir la liste des Valeurs
    Iterator<Matrice> iterateur = listKeys.iterator();
    // Afficher les valeurs de l'objet;
    while (iterateur.hasNext()) {
    	System.out.println(iterateur.next());
    }
    Et cela te donnera presque la même chose que ce que tu as obtenu !

    Citation Envoyé par cheyma Voir le message
    Nom : Capture.PNG
Affichages : 2525
Taille : 2,9 Ko
    Mais c'est pas exactement ce que tu veux.
    Tu te demande donc pourquoi ce résultat.... la réponse est simple !
    Lorsque tu écris cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Matrice {...
    en fait c'est comme si tu écrivais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Matrice extends Object {...
    En effet, toute les classes hérite implicitement de la classe Object et lorsque tu passe mat.get(key) ou iterateur.next() à la méthode System.out.println, c'est comme si tu avais écris mat.get(key).toString().
    La méthode toString de Object est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    Ce qui explique l'affichage que tu as obtenu !
    Si tu veux changer l'affichage, il faut donc que tu surcharge la méthode toString de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static class Matrice {
    ....
      @Override
      public String toString() {
          return this.gram + "\t" + this.fq1 + "\t" + this.fq2;
      }
    ....
    }
    Et maintenant tu aura l'affichage que tu souhaites.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    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. Réponses: 2
    Dernier message: 16/11/2008, 16h09
  2. [Débutant] Créer une matrice à partir d'un fichier .txt
    Par niepoc dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/05/2008, 22h40
  3. Remplir une matrice à partir d'un vecteur (Suite)
    Par amarion dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/03/2008, 08h23
  4. Remplir une matrice à partir d'un vecteur
    Par amarion dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/03/2008, 12h17
  5. Remplir une liste à partir d'un fichier texte
    Par leroidje dans le forum Langage
    Réponses: 1
    Dernier message: 01/07/2007, 08h41

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