2009-11-12 7 views
0

Hé les gars, ceci est une suite à my previous question. J'ai maintenant un fichier texte qui est formaté comme ceci:Obtention d'un fichier texte dans un tableau bidimensionnel irrégulier en Java

100 200 
123 
124 123 145 

Ce que je veux faire est d'obtenir ces valeurs dans un tableau en haillons deux dimensions en Java. Ce que j'est jusqu'à présent ceci:

public String[][] readFile(String fileName) throws FileNotFoundException, IOException { 
     String line = ""; 
     ArrayList rows = new ArrayList(); 


     FileReader fr = new FileReader(fileName); 
     BufferedReader br = new BufferedReader(fr); 

     while((line = br.readLine()) != null) { 
     String[] theline = line.split("\\s");//TODO: Here it adds the space between two numbers as an element 
     rows.add(theline); 
     } 
     String[][] data = new String[rows.size()][]; 
     data = (String[][])rows.toArray(data); 
     //In the end I want to return an int[][] this a placeholder for testing 
     return data; 

Mon problème ici est que, par exemple pour la ligne 100 200 la variable « Theline » comporte trois éléments {"100","","200"} qui il passe ensuite aux lignes avec rows.add(theline) Ce que je veux est d'avoir juste les nombres et si possible comment convertir ce tableau String [] [] en un tableau int [] [] à la fin pour le renvoyer. Merci!

+0

Vous pourriez trouver dans cette discussion un peu d'inspiration http://stackoverflow.com/questions/691184/scanner-vs-stringtokenizer-vs-string-split – Adrian

Répondre

0

OK c'est une solution basée sur ce que Gonzo suggéré:

public int[][] readFile(String fileName) throws FileNotFoundException, IOException { 
    String line = ""; 
    ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 


    FileReader fr = new FileReader(fileName); 
    BufferedReader br = new BufferedReader(fr); 

    int r = 0, c = 0;//Read the file 
    while((line = br.readLine()) != null) { 
     Scanner scanner = new Scanner(line); 
     list.add(new ArrayList<Integer>()); 
     while(scanner.hasNext()){ 

      list.get(r).add(scanner.nextInt()); 
      c++; 
     } 
     r++; 
    } 

    //Convert the list into an int[][] 
    int[][] data = new int[list.size()][]; 
    for (int i=0;i<list.size();i++){ 
     data[i] = new int[list.get(i).size()]; 
     for(int j=0;j<list.get(i).size();j++){ 
      data[i][j] = (list.get(i).get(j)); 
     } 


    } 
    return data; 
} 
1

au lieu d'utiliser .split(), vous pouvez essayer d'utiliser un StringTokenizer pour diviser vos lignes vers le haut dans seulement le nombre

2

Si vous utilisez la classe Scanner, vous pouvez continuer à appeler nextInt()

Par exemple (ce qui est le p-code ... vous devrez nettoyer)

scanner = new Scanner(line); 
while(scanner.hasNext()) 
    list.add(scanner.nextInt()) 
row = list.toArray() 

cela est bien sûr pas très optimisé soit.

+0

Je travaille sur une solution en utilisant votre suggestion , Je le posterai une fois que tout sera réglé. – Bar

0

Votre analyse fonctionne correctement lorsque je l'ai essayée. deux

line.split("\\s"); 

et

line.split(" "); 

diviser les données d'échantillon dans le bon nombre d'éléments de chaîne. (Je me rends compte que le « \ de » version est la meilleure façon de le faire)

est ici un moyen de force brute pour convertir les tableaux int tableaux

int [][] intArray = new int[data.length][]; 
for (int i = 0; i < intArray.length; i++) { 
    int [] rowArray = new int [data[i].length]; 
    for (int j = 0; j < rowArray.length; j++) { 
     rowArray[j] = Integer.parseInt(data[i][j]); 
    } 
    intArray[i] = rowArray; 
} 
Questions connexes