2D Array von .txt dateien einlesen, aber wie?
In einem Programm brauch ich ein 2Dimensionales Array
Hoffe, dass das Problem klar ist. Ich bin relativ neu beim Programmieren, also bitte nicht mit irgendwelchen Fremdwörtern rumschmeisen ^^ .
Danke!
int wallkoords
, dessen Inhalt von einer Text-Datei einlesen möchte.Das Array ist 25 x 25 Felder groß. Also zB:static int wallkoords = {
Soll von einer Datei "LEVEL1.txt" gelses werden.
}Hoffe, dass das Problem klar ist. Ich bin relativ neu beim Programmieren, also bitte nicht mit irgendwelchen Fremdwörtern rumschmeisen ^^ .
Danke!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 50464
Url: https://administrator.de/forum/2d-array-von-txt-dateien-einlesen-aber-wie-50464.html
Ausgedruckt am: 23.12.2024 um 17:12 Uhr
12 Kommentare
Neuester Kommentar
Prinzipielle Vorgehensweise:
Dir bleibt nichts übrig, als Definition und Initialisierung zu trennen:
public class Test_Array {
static int wallkoords; Definition
static { statischer Konstruktor, wird nur einmal aufgerufen beim ersten Verwenden der Klasse, wobei die Frage ist, ob es nicht besser ist eine Methode dafür zu nehmen.
wallkoords = new int [25][25]; // Initialisierung
for(int i=0;i<25;i++) {
for(int j=0;j<25;j++) {
wallkoords[i][j] = Wert;
}
}
}
}
Dann musst Du in der Schleife die Datei einlesen und entsprechend zerlegen. Da kann ich Dir jetzt kein Beispiel bringen, da ich ja nicht weiß, wie Deine Datei aufgebaut ist, was passieren soll, wenn in der Datei keine 25 auf 25 Werte drin sind (oder wenn mehr drin sind) etc.
Aber
Dir bleibt nichts übrig, als Definition und Initialisierung zu trennen:
public class Test_Array {
static int wallkoords; Definition
static { statischer Konstruktor, wird nur einmal aufgerufen beim ersten Verwenden der Klasse, wobei die Frage ist, ob es nicht besser ist eine Methode dafür zu nehmen.
wallkoords = new int [25][25]; // Initialisierung
for(int i=0;i<25;i++) {
for(int j=0;j<25;j++) {
wallkoords[i][j] = Wert;
}
}
}
}
Dann musst Du in der Schleife die Datei einlesen und entsprechend zerlegen. Da kann ich Dir jetzt kein Beispiel bringen, da ich ja nicht weiß, wie Deine Datei aufgebaut ist, was passieren soll, wenn in der Datei keine 25 auf 25 Werte drin sind (oder wenn mehr drin sind) etc.
Aber
public class Test_Array {
static int wallkoords;
static {
java.lang.String sTemp;
int i,j;
wallkoords = new int [25][25];
try {
// Datei öffnen
java.io.BufferedReader oReader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(new java.io.File("D:\\test.txt"))));
// Zeile für Zeile einlesen
i=0;
while ((sTemp = oReader.readLine()) != null) {
// Zeile in Einzelteile zerlegen (wir trennen durch ,
java.util.StringTokenizer stWerte = new java.util.StringTokenizer(sTemp,",");
j=0;
// Nun eintragen in den Array. Es wird nicht überprüft, ob die Grenzen überschritten werden!
while(stWerte.hasMoreTokens()) {
wallkoords[i][j] = java.lang.Integer.parseInt(stWerte.nextToken());
j++;
}
i++;
}
} catch (java.io.FileNotFoundException e) {
e.printStackTrace(); //Fehler ausdrucken
} catch (java.io.IOException e) {
e.printStackTrace(); //Fehler ausdrucken
}
}
public static void main(String args) {
for(int i=0;i<24;i++) for(int j=0;j<24;j++) System.out.println(wallkoords[i][j]);
}
}
0,0,0,1, ...
1,1,0,0, ... usw.
Und noch viel Spass beim NetHack programmieren
Zu den Formatierungen:
Dann versuchen wir mal Licht ins Dunkel zu bringen:
Die lange Zeile mit dem BufferedReader könnte man auch in mehreren Zeilen schreiben, aber das ist nicht nötig.
new java.io.File(Dateiname) erzeugt ein neues Fileobjekt
new java.io.FileInputStream(Fileobjekt) erzeugt ein Eingabestream aus der File
new java.io.InputStreamReader(InputStream) erzeugt einen Reader aus dem Eingabestream
new java.io.BufferedReader(StreamReader) erzeugt dann den BufferedReader, den wir benutzen.
Das zwischendrin sind sozusagen nur Hilfsklassen, um es hinterher möglichst komfortabel lesen zu können.
sTemp = oReader.readLine() ließt eine Zeile aus der Datei ein.
!= null prüft, ob das eingelesene ungleich null ist, null bedeutet nicht initialisiert, d.h. damit kriege ich das Dateiende raus. Eine leere Zeile gibt nämlich nicht null, sondern den Leerstring "".
Der Stringtokenizer zerlegt einen String an den angegebenen Trennzeichen (hier ,), .nextToken gibt einfach den nächsten durch das Trennzeichen getrennten Wert zurück.
Man kann sicherlich auch alles in eine Datei packen, allerdings müsstest Du beim Einlesen dann irgendwie nachkontrollieren, ob die Zeile die man einliest jetzt die richtige ist. Ich würde es in einzelne Dateien packen.
Dann versuchen wir mal Licht ins Dunkel zu bringen:
Die lange Zeile mit dem BufferedReader könnte man auch in mehreren Zeilen schreiben, aber das ist nicht nötig.
new java.io.File(Dateiname) erzeugt ein neues Fileobjekt
new java.io.FileInputStream(Fileobjekt) erzeugt ein Eingabestream aus der File
new java.io.InputStreamReader(InputStream) erzeugt einen Reader aus dem Eingabestream
new java.io.BufferedReader(StreamReader) erzeugt dann den BufferedReader, den wir benutzen.
Das zwischendrin sind sozusagen nur Hilfsklassen, um es hinterher möglichst komfortabel lesen zu können.
sTemp = oReader.readLine() ließt eine Zeile aus der Datei ein.
!= null prüft, ob das eingelesene ungleich null ist, null bedeutet nicht initialisiert, d.h. damit kriege ich das Dateiende raus. Eine leere Zeile gibt nämlich nicht null, sondern den Leerstring "".
Der Stringtokenizer zerlegt einen String an den angegebenen Trennzeichen (hier ,), .nextToken gibt einfach den nächsten durch das Trennzeichen getrennten Wert zurück.
Man kann sicherlich auch alles in eine Datei packen, allerdings müsstest Du beim Einlesen dann irgendwie nachkontrollieren, ob die Zeile die man einliest jetzt die richtige ist. Ich würde es in einzelne Dateien packen.
public class Boot {
public Boot() {
BeginSession();
intmap = helper.Test_Array.map;
TileGrid grid = new TileGrid(map);
Player player = new Player(grid);
while(!Display.isCloseRequested()) {
Clock.update();
grid.Draw();
player.Update();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public static void main(String args) {
new Boot();
new Spliter();
new JMenuItemBeispiel();
}
}
public Boot() {
BeginSession();
intmap = helper.Test_Array.map;
TileGrid grid = new TileGrid(map);
Player player = new Player(grid);
while(!Display.isCloseRequested()) {
Clock.update();
grid.Draw();
player.Update();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public static void main(String args) {
new Boot();
new Spliter();
new JMenuItemBeispiel();
}
}
public class Test_Array {
public static int map;
static {
java.lang.String sTemp;
int i,j;
map = new int [20][15];
try {
Datei öffnen
java.io.BufferedReader oReader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(new java.io.File("res/Map2.txt"))));
Zeile für Zeile einlesen
i=0;
while ((sTemp = oReader.readLine()) != null) {
Zeile in Einzelteile zerlegen (wir trennen durch ,
java.util.StringTokenizer stWerte = new java.util.StringTokenizer(sTemp,",");
j=0;
Nun eintragen in den Array. Es wird nicht überprüft, ob die Grenzen überschritten werden!
while(stWerte.hasMoreTokens()) {
map[i][j] = java.lang.Integer.parseInt(stWerte.nextToken());
j++;
}
i++;
}
} catch (java.io.FileNotFoundException e) {
e.printStackTrace(); Fehler ausdrucken
} catch (java.io.IOException e) {
e.printStackTrace(); Fehler ausdrucken
}
}
public static void main(String args) {
for(int i=0;i<24;i++) for(int j=0;j<24;j++) System.out.println(map[i][j]);
}
}
public static int map;
static {
java.lang.String sTemp;
int i,j;
map = new int [20][15];
try {
Datei öffnen
java.io.BufferedReader oReader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(new java.io.File("res/Map2.txt"))));
Zeile für Zeile einlesen
i=0;
while ((sTemp = oReader.readLine()) != null) {
Zeile in Einzelteile zerlegen (wir trennen durch ,
java.util.StringTokenizer stWerte = new java.util.StringTokenizer(sTemp,",");
j=0;
Nun eintragen in den Array. Es wird nicht überprüft, ob die Grenzen überschritten werden!
while(stWerte.hasMoreTokens()) {
map[i][j] = java.lang.Integer.parseInt(stWerte.nextToken());
j++;
}
i++;
}
} catch (java.io.FileNotFoundException e) {
e.printStackTrace(); Fehler ausdrucken
} catch (java.io.IOException e) {
e.printStackTrace(); Fehler ausdrucken
}
}
public static void main(String args) {
for(int i=0;i<24;i++) for(int j=0;j<24;j++) System.out.println(map[i][j]);
}
}
Exception in thread "main" java.lang.ExceptionInInitializerError
at data.Boot.<init>(Boot.java:36)
at data.Boot.main(Boot.java:57)
Caused by: java.lang.NumberFormatException: For input string: "{0"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at helper.Test_Array.<clinit>(Test_Array.java:37)
... 2 more
at data.Boot.<init>(Boot.java:36)
at data.Boot.main(Boot.java:57)
Caused by: java.lang.NumberFormatException: For input string: "{0"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at helper.Test_Array.<clinit>(Test_Array.java:37)
... 2 more
Sich an einen 10 Jahre alten Thread dranzuhängen ist nur bedingt sinnvoll, wenn die, die damals geantwortet haben nicht mehr dabei wären, würde es niemand mehr sehen (es wird hier nach Erstellungsdatum des Threads sortiert, nicht nach dem letzten Post dazu),
Aber um auf das Problem zurückzukommen:
Die Fehlermeldung sagt doch eigentlich alles aus:
Also in der Eingabedatei die {} weglassen.
Aber um auf das Problem zurückzukommen:
Die Fehlermeldung sagt doch eigentlich alles aus:
Caused by: java.lang.NumberFormatException: For input string: "{0"
{0 lässt sich nicht in eine Zahl konvertieren, denn was soll er mit { machen?Also in der Eingabedatei die {} weglassen.