Initialiser une matrice avec un fichier texte [Résolu]

afalaze 3 Messages postés samedi 13 novembre 2004Date d'inscription 11 janvier 2007 Dernière intervention - 10 janv. 2007 à 19:25 - Dernière réponse : foutayeni 4 Messages postés dimanche 3 juillet 2005Date d'inscription 23 septembre 2009 Dernière intervention
- 29 mars 2007 à 17:46
Bonjour;
Je cherche à initialiser une matrice carrée à l'aide d'un fichier texte de la forme suivante
-------------- fichier.txt ---------------
3
L 1 2 3
L 1 2 5
L 0 4 9
------------------------------------------
La première ligne represente la dimension de la matrice carrée
Les lignes suivantes les valeurs de chaque ligne de la matrice, "L" pour signaler les lignes à traiter.
Voici le listing de Matrice.java :

------------------------------ Matrice.java --------------------------

import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.util.StringTokenizer;
import java.lang.Integer;

public class Matrice
{
    int[][] matrice;
    int  dimMatrice = 0;
   
    // Affichage du contenu de la matrice
    private void affichage(int dim)
    {
        for(int i=0; i<dim; i++)
        {
            for(int j=0; j<dim; j++)
            {
                System.out.print(matrice[i][j] +"\t");               
            }
            System.out.println();
        }
    }
   
    // Dimension du graphe
    public int getDimension()
    {
        return dimMatrice;
    }
   
    // Initialiser une matrice depuis un fichier texte
    public Matrice(String fichier) throws IOException
    {
        BufferedReader entree = new BufferedReader(new FileReader(fichier));
        int nbLigne = 0; //Compteur de boucle       
        String lignelue = null;
        while((lignelue = entree.readLine()) != null)
        {
            StringTokenizer tok = new StringTokenizer(lignelue, " ");               
            while(tok.hasMoreTokens())
            {
                if(nbLigne == 0)
                {
                    //dimMatrice = Integer.parseInt(lignelue);
                    dimMatrice = Integer.parseInt(tok.nextToken());
                    System.out.println("La dimension de la matrice : "+dimMatrice);
                    nbLigne++;
                }   
                else
                {   
                    matrice = new int[dimMatrice][dimMatrice];       
                    if(tok.nextToken() == "L")
                    {
                        tok.nextToken();
                    }
                    for(int j=0; j<dimMatrice; j++)
                    {
                        matrice[nbLigne-1][j] = Integer.parseInt(tok.nextToken());
                    }
                    nbLigne++;   
                }       
            }   
                   
        }       
        entree.close();
    }
   
    public static void main(String argc[]) throws IOException
    {
        System.out.println("Initialisation de la matrice");
        Matrice matrice = new Matrice("fichier.txt");
        matrice.affichage(matrice.getDimension());
    }
}

-------------------------------------------------------------------------------

A l'execution, j'obtien bien la dimension de la matrice mais celle celle-ci s'initialise mal à l'exception de la dernier ligne :

java matrice
Initialisation de la matrice
La dimension de la matrice : 3
0       0       0
0       0       0
0       4       9

Je pense que je me sert mal de la classe StringTokenizer
Aidez moi à y voire plus claire.
Merci
   
Afficher la suite 

4 réponses

Répondre au sujet
afalaze 3 Messages postés samedi 13 novembre 2004Date d'inscription 11 janvier 2007 Dernière intervention - 11 janv. 2007 à 11:17
+3
Utile
Je vien de trouver la faille :
La matrice est écrasée à chaque passage dans le bloc else

else
                {   
                    matrice = new int[dimMatrice][dimMatrice];       
                    if(tok.nextToken() == "L") .....

Il suffit de remettre matrice = new int[dimMatrice][dimMatrice]; dans le bloc if pour que la matrice soit créee une seule fois.

if(nbLigne == 0)
                {
                    //dimMatrice = Integer.parseInt(lignelue);
                    dimMatrice = Integer.parseInt(tok.nextToken());
                    System.out.println("La dimension de la matrice : "+dimMatrice);
                    matrice = new int[dimMatrice][dimMatrice];   
                    nbLigne++;                  
                }   
                else
                {    ......

Ainsi à l'execution :

Initialisation de la matrice
La dimension de la matrice : 3
1       2       3
1       2       5
0       4       9
Press any key to continue...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de afalaze
kaloway 358 Messages postés jeudi 24 octobre 2002Date d'inscription 30 mars 2011 Dernière intervention - 10 janv. 2007 à 20:46
0
Utile
la comparaison d'une chaine de caractère ne se fait pas avec "==" mais avec equals.

exemple tok.nextToken().equals("L")
Commenter la réponse de kaloway
afalaze 3 Messages postés samedi 13 novembre 2004Date d'inscription 11 janvier 2007 Dernière intervention - 11 janv. 2007 à 01:27
0
Utile
Merci koloway pour m'avoir repondu si vite.
J'ai bien essayé ta suggestion en remplaçant
if(tok.nextToken() == "L")
par
if(tok.nextToken().equals( "L"))

mais à l'execution j'ai le message suivant :
Initialisation de la matrice
La dimension de la matrice : 3
Exception in thread "main" java.util.NoSuchElementException
        at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
        at Matrice.(Matrice.java:75)
        at Matrice.main(Matrice.java:88)
Press any key to continue...

En rectifiant "L" par 'L' :
if(tok.nextToken().equals( 'L'))
Je revien à la case départ c.a.d :
java matrice
Initialisation de la matrice
La dimension de la matrice : 3
0       0       0
0       0       0
0       4       9

Donc je ne comprend pas pourquoi la troisième ligne est traitée et non pas les 2 premières ?
Commenter la réponse de afalaze
foutayeni 4 Messages postés dimanche 3 juillet 2005Date d'inscription 23 septembre 2009 Dernière intervention - 29 mars 2007 à 17:46
0
Utile
Bonsoir
est ce que t'as trouvé le problème ou pas encore?
Commenter la réponse de foutayeni

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.