2016-12-16 3 views
1

Ich habe einige Probleme beim Lesen aus einer Datei. Ich versuche, aus einer Textdatei zu lesen und die Zeichen in eine Matrix zu schreiben. Das Problem ist, dass ich eine IndexOutOfBounds-Ausnahme habe und ich weiß nicht, warum das passiert.Seltsames Verhalten beim Lesen der Datei aus Java

Dies ist mein Code:

public static char[][] readTxt(String args[]) { 
    String file = args[0]; 
    try { 
     FileReader fr = new FileReader(file); 
     BufferedReader br = new BufferedReader(fr); 

     String line = br.readLine(); 

     //counter 
     int counter = 0; 

     String[] tam = line.split(","); 

     char[][] maze = new char[tam.length][tam.length]; 

     while (line != null) { 
      String[] values = line.split(","); 

      for (int i = 0; i < values.length; i++) { 
       maze[counter][i] = values[i].charAt(0); 
      } 
      counter++; 
      line = br.readLine(); 
     } 
     br.close(); 
     return maze; 
    } catch (Exception e) { 
     System.out.println("Exception reading file " + file + ": " + e); 
    } 
    return null; 
} 

Es IndexOutOfBounds in char[][] maze = new char[tam.length][tam.length];

Meine Eingangs wirft sieht wie folgt aus:

%,%,%,%,%,%,%,%,%,%,% %,C, , , ,C, , ,C, ,% %,%,%, , , ,%,%,%,%,% %,C, , , ,C, , , , ,% %, , , , , , , , , ,% %, , , , , , , , , ,% %, , , , , , , , , ,% %, , , , , , , , , ,% %, , , , , , , , , ,% %, , , , , , , , , ,% %,%,%,%,%,%,%,%,%,%,%

Ich versuchte auch, es zu ändern:

char[][] maze = new char[tam.length+1][tam.length+1]; 

Und jetzt funktioniert es, aber ich weiß nicht warum. Irgendwelche Ideen?

PD: als ich die Matrix gedruckt habe, sah ich etwas seltsam. Es sieht aus wie es einige leere Zeichen auf der rechten Seite meiner Matrix gedruckt, aber in meiner Eingabedatei nicht, den ich schrieb keine Leer :(

my matrix in java

Irgendwelche Ideen?

+3

Ihre erste Zeile ist bereits gelesen. – Bhoot

+0

Woher kommt 'linea'? –

+1

Was sind die Daten in der Datei? –

Antwort

1

Ist Ihre Annahme, dass hast du immer so viele Zeilen wie du Einträge innerhalb einer Zeile richtig hast?

Ich würde die Anrufe nicht auf readLine so weit auseinander legen Wusstest du, dass du sowas auch mit Streams schreiben könntest und mit nio.Files?

Ihr Code irgendwie anders, ohne die Notwendigkeit für die Zähler zu überprüfen:

Character[][] maze = Files.lines(Paths.get(stringPathOrUri)) 
     .map(s -> s.split(",")) 
     .map(strings -> Stream.of(strings) 
          .map(s -> s.charAt(0)) // better: insert your transformation function here 
          .toArray(Character[]::new)) 
     .toArray(Character[][]::new); 

Dies kann noch verbessert werden, aber man kann die Idee.