2016-06-20 7 views
-1

Ich möchte den Inhalt der Datei in einem 2D-Array lesen und speichern, aber ich kenne die Größe der Datei nicht, weil das Programm verschiedene Dateien lesen sollte. Es gibt also das erste Problem nach "new char". Ich suchte nach dem Problem und fand, dass "Matrix [x] [y] = zeile.charAt (x);" sollte richtig sein, aber das wirft den Fehler "NullPointerException", wenn ich eine beliebige Zahl in die ersten Klammern des neuen Char schreiben. Kann jemand erklären und Ideen oder Lösungen geben? Danke :)Wie kann ich eine Datei in einem 2D-Array lesen und speichern?

import java.io.*; 

class Unbenannt 
{ 
    public static void main(String[] args) throws IOException 
    { 
    FileReader fr = new FileReader("Level4.txt"); 
    BufferedReader br = new BufferedReader(fr); 

    String zeile = br.readLine(); 
    char [][] matrix = new char [][]; 

    while(zeile != null) 
    { 
     int y = 0; 
     for(int x = 0; x < zeile.length(); x++) { 
      matrix[x][y] = zeile.charAt(x); 
     } 
     y++; 
    } System.out.print(matrix); 
    br.close(); 
    } 
} 
+0

Ihr Code eine Endlosschleife schafft, da Sie nicht 'zeile' lesen von' br' überall in der Schleife. – Sanjeev

+0

Ihre Initialisierung von 'matrix' ist ungültig, Sie müssen Kapazität beim Initialisieren eines Arrays setzen. – Sanjeev

Antwort

0

Arrays als Blöcke gespeichert sind, im Speicher, um O (1) -Operationen zu erreichen, weshalb Sie ihre Größe während der Definition definieren müssen. Wenn Sie auf Arrays bestehen (anstelle eines dynamischen ADT wie List), müssen Sie die Dimensionen im Voraus kennen.

Was Sie tun können, ist die Dateizeilen vorübergehend in einer Liste speichern und die maximale Zeilenlänge herauszufinden, das heißt:

List<String> lines = new ArrayList<String>(); 
String zeile = null; 
int max = 0; 

while ((zeile = br.readLine()) != null) { 
    lines.add(zeile); 
    if (zeile.length() > max) 
     max = zeile.length(); 
} 

char[][] matrix = new char[lines.length()][max]; 

// populate the matrix: 
for (int i = 0; i < lines.length(); i++) { 
    String line = lines.get(i); 
    for (int j = 0; j < line.length(); j++) { 
     matrix[i][j] = line.charAt(j); 
    } 
} 

Beachten Sie, dass seit char ein primitiver ist, werden Sie mit dem Standard initialisiert werden Geben Sie in jeder Zelle des inneren Arrays den Wert 0 (die ganze Zahl, nicht das Zeichen!) ein. Für Zeilen, die kürzer als die anderen Zeilen sind, haben Sie nachgestellte Nullzeichen.

+0

vielen dank :) – lorellixx

0

Sie die Matrix (char [] []) zu initialisieren, aber sie nie der eingehenden Arrays initialisieren. Dies führt zur NullPointerException.

Neben Ihrem ‚while‘ Zustand ungültig aussieht, scheint nur die erste Zeile der Datei lesen hier> Ihr Code wird nie abgeschlossen und die erste Zeile über gelesen und immer wieder

0

Danke euch allen! Es klappt! Aber es gibt immer noch ein Problem. Ich habe lines.length() in lines.size() geändert, weil es nicht mit der Länge funktioniert. Das Problem ist die Ausgabe. Es zeigt zum Beispiel: xxxx xxxx statt "xxx" und "x x" und "xxx" untereinander. Wie kann ich einen Zeilenumbruch einbauen? mein Programmcode ist:

import java.io.*; 
import java.util.ArrayList; 


class Unbenannt 
{ 
    public static void main(String[] args) throws IOException 
    { 
    FileReader fr = new FileReader("Level4.txt"); 
    BufferedReader br = new BufferedReader(fr); 

    ArrayList<String> lines = new ArrayList<String>(); 
    String zeile = null; 
    int max = 0; 
    while ((zeile = br.readLine()) != null) { 
     lines.add(zeile); 
     if (zeile.length() > max) 
      max = zeile.length(); 
    } 
    char [][] matrix = new char[lines.size()][max]; 

    for(int i = 0; i < lines.size(); i++) { 
     String line = lines.get(i); 
     for(int j = 0; j < line.length(); j++) { 
      matrix[i][j] = line.charAt(j); 
      System.out.print(matrix[i][j]); 
     } 
    } 
    br.close(); 
    }  
}