Matrix aus Textdatei auslesen

Hi zusammen,

Ich hab folgende Aufgabe bekommen bei der ich ein paar Anhaltspunkte brauche, da ich nicht so recht weiß wo ich anfangen soll.
Und zwar soll ich eine Matrix (rechteckig oder Flattermatrix) aus einer Textdatei auslesen. Bis jetzt habe ich eine ArrayList mittels der Klasse Scanner , der ich ein File Objekt verknüpft mit einer TextDatei übergeben hab, befüllt. Wenn ich die Liste mittels einer for- Schleife ausgebe, dann sieht das auch schon ganz anständig aus.

Mein Problem ist, dass die Methode einen 2 Dimensionalen Int-Array zurückgeben soll. Und ich in mir nicht sicher, wie ich die Array List in einen solche überführen soll.
Ich kannte die Klasse ArrayList bis jetzt auch noch gar nicht. Vielleicht ist mir einfach eine entsprechende Methode nicht bekannt.

		Scanner eingabe = new Scanner(datei);
		ArrayList matrix = new ArrayList();
		
		while(eingabe.hasNextLine()){
			if(eingabe.nextLine() != null ){
				matrix.add(eingabe.nextLine());
			}	
		}
		
		for (int i = 0; i < matrix.size(); i++){
			System.out.println(matrix.get(i));
		}```

Gruß Midget

da gibt es keine magische fertige Methode, du musst schon arbeiten

für den Anfang betrachte nur eine Zeile der Datei, erstelle daraus ein eindimensionales int[],
Problem genug? gewiss, ohne Kenntnisse von vielen Dingen kann man nicht viel machen,

String.subString(), indexOf(),
split() ist mächtiges Werkzeug,
StringTokenizer,
Zahlen nach Integer parsen,
probiere ruhig lang und breit, suche im Internet nach all den Dingen,

bei so grundlegenden Dingen musst du nun nicht mit maximal 300 Tastaturanschlägen zum Ziel kommen,
sondern kannst dich ins breite Lernen der Programmiersprache stürzen :wink:

falls keine Nerven dafür oder alles weiterhin Bahnhof kann es ja bei nächster Nachfrage evtl. konkreter werden

Nein, ich will das schon vernünftig lernen. Wenn es dafür keine fertige Methode gibt , werde ich wohl die ArrayList anhand von Leerzeichen und Zeilenumbrüchen zerpflücken müssen. Ich nehme an die Methoden, die du genannt hast, tuen genau das. Ich stürz mich mal in die Recherche. Wenn ich nicht weiterkomme oder fertig bin melde ich mich nochmal.

Vielen dank schon mal :slight_smile:

konzentriere dich nur nicht zu sehr auf die schon wieder erwähnte ArrayList, deren Aufgabe ist nur mehrere Strings zu enthalten, kaum beteiligt,
ein String = ein int[],
viele Strings = viele int[], zusammen ein int[][]

wenn du die Anzahl der Zeilen vorher weißt, kannst du ganz ohne ArrayList arbeiten, gleich int[] je Zeile basteln und in int[][] ablegen,
sonst ArrayList lediglich ein Zwischenspeicher für die String-Zeilen,

Listen kann man dynamisch befüllen, Arrays vorher richtige Größe anzugeben, auch schon wichtige Lektion

Ich muss eine beliebige Matrix einlesen könne, daher hab ich mir für die ArrayList entschieden.

Eine Möglichkeit: Erstelle dir eine Methode
private static int[] parse(String line) { ... }
die eine einzelne Zeile in einen int-Array verwandelt. Teste diese Methode, z.B. mit

System.out.println(Arrays.toString(parse("1 2 3")));
System.out.println(Arrays.toString(parse("   1 2 3")));
System.out.println(Arrays.toString(parse("1 2 3    ")));
System.out.println(Arrays.toString(parse("1 2 3.0"))); // Sollte krachen: 3.0 ist kein int
System.out.println(Arrays.toString(parse("1 2 boo! 3"))); // Sollte krachen...

Wenn das funktioniert, kannst du die verwenden, um aus der Eingabe eine List<int[]> zu erstellen. Diese kann dann, wenn gewünscht, in einen 2D int[][]-Array verwandelt werden (das ist aber ein zweiter Schritt).

Alternativ dazu könnte die “parse”-Methode auch eine List<Integer> zurückgeben. Dann hättest du am Ende eine List<List<Integer>>, die auch in einem int[][]-Array verwandelt werden könnte.

[quote=AngryMidget]Nein, ich will das schon vernünftig lernen.[/quote]Dann solltest Du auch gleich damit anfangen, die Instanz der [JAPI]ArrayList[/JAPI] (also das, was rechts von new steht) einer Variablen (also das, was links vom = steht) vom Typ [JAPI]List[/JAPI] (das, was beim ersten Auftreten der Variablen davor steht) zuzuordnen.

Der Sinn ist, dass Du später einen anderen [JAPI]List[/JAPI]-Typ verwenden kannst, ohne den Rest vom Code zu ändern (insbesondere die Typen von Methodenparametern…)

bye
TT

Guten Tag,
hab nur mal schnell drübergesehen.
3.0 true eigentlich ziemlich viel, kann natürlich als int interpretiert werden, es ist nur etwas “umständlicher”.
So kann auch ein “wild-dirty” Textfile gelesen und interpretiert werden.

Zurück zum Thema, eine vorgefertigte Methode gibt es dafür nicht, Teilaufgaben, in anderen Programmiersprachen gibt es sie, ich denke da an Python.

Deswegen musst du nicht unbedingt die Programmiersprache wechseln, auch wenn Java so die Eigenschaft behauptet wird, sehr langsam zu sein, es gibt ein paar Mechanismen um das zu umgehen.

Nein, eigentlich stimmt das mit langsam nicht.

Ich würd beim Lesen direkt in die richtige Form bringen - oder das hinterher machen, beides kann Vor- Nachteile haben.

Methoden usw. wurden glaube ich schon genannt, nur noch “umsetzen”.
Grüße

Hi,

also ich hab jetzt ein wenig rumgespielt und mittels der Methode Scanner.nextLine(), die einzelnen Zeilen eingelesen und als String in einer ArrayList gespeichert.
Meine Idee war jetzt einen int[][] array, der in seiner ersten Dimension die Länge von ArrayList.size() hat und in seiner zweiten Dimension dynamisch mit den Zahlen der Einzelnen String befüllt wird.

Jetzt wollte ich über die Methode StringBuffer.remove(IndexOf("//s")) sämtliche Leerzeichen killen, und dann den String mit einer for-schleife durchlaufen und in die Zweite dimension des Integer arrays einfügen. Problem die Methode gibt mir -1 zurück. Wenn ich die API richtig verstanden habe, bedeutet dies ,dass er das Zeichen nicht findet. Warum auch immer.

Und btw. Verstehe ich das richtig, dass ich dann nur das erste Leerzeichen lösche und nicht alle ?

äh ja, soweit auch schon am Anfang gepostet :wink:

dieser spitzfindige Kommentar kombiniert mit nochmal einen Hinweis zu ganz oben:

                matrix.add(eingabe.nextLine());
            } 

bei diesem Code wird Zeile 1 gelesen, als nicht null anerkannt, dann Zeile 2 gelesen (neuer Lesebefehl liefert nächste Zeile!) und in die Liste eingefügt usw., Vorsicht

sollte man aber bei der Ausgabe im Vergleich zur Datei schnell bemerken, vielleicht lange nicht mehr aktuell,
mit einer Testdatei

abc
def
ghi
jkl

bekomme ich mit Code von Posting 1 jedenfalls nur Ausgabe

def
jkl


StringBuffer.remove(IndexOf(„//s“)) ist kein richtiger Code, besser bei konkreten Fragen zu sowas richtigen Code posten damit genau zu verstehen,

poste überhaupt doch erstmalig, wie eine solche Zeile der Datei aussieht, falls „1 2 55 4“ wäre Löschen von Leerzeichen zu „12554“ nicht besonders hilfreich…,
wie wäre es mit der split-Methode, gerne nach Leerzeichen splitten, evtl. auch Komma usw., was immer da ist?

So kurzer Zwischenstand:

		
		File datei = new File("matrix.txt");
		Scanner eingabe = new Scanner(datei);
		
		ArrayList<String> container = new ArrayList();
		while(eingabe.hasNextLine()){
			container.add(eingabe.nextLine());
		}
		
		
		int[][] matrix = new int[container.size()][];
		for (int i = 0; i < container.size(); i++){
			String[] test = container.get(i).split(" ");
			matrix** = new int[test.length];
			for (int k = 0; k < test.length; k++){
				System.out.println(test[k]);
				matrix**[k] = Integer.valueOf(test[k]);
			}
		}
 		
		for (int i = 0; i < matrix.length; i++){
			for(int k = 0; k < matrix**.length; k++){
				System.out.print(matrix**[k]);
				System.out.print(" ");
			}
			System.out.println();
		}
		
	}	```

Ich denke ich bin soweit fertig, wobei ich mir noch Gedanken machen muss, wie auf nicht-int Werte reagiere.  Ein Buchstabe in der Datei wird doch mit Sicherheit eine Exception werfen oder ? 
Da mir nichts einfällt um das von vorne hinein auszuschließen, werde ich mich wohl einem try/catch Konstrukt bedienen müssen.

Vielen Dank nochmal !
Gruß 
Midget

[quote=AngryMidget]Jetzt wollte ich über die Methode StringBuffer.remove(IndexOf("//s")) sämtliche Leerzeichen killen[/quote]Blöde Frage an Rande: woher soll der Computer ohne die Leerzeichen wissen, wie lang die einzelnen Zahlen der Matrix sind? (oder sind nur einstellige Zahlen zulässig?)

bye
TT

int (separiert durch Kommata), 3.0 == 3, false == 0, true == 1, etc. könnte ebenso als int interpretiert werden, umgangssprachlich “wild dirty”, bei verschiedenen Matrizen gebräuchlich. Ich weiß nicht, wieso das närrisch sein sollte. …

Prinzipiell musst du zweimal separieren, Zeilen übernimmt bereits " Scanner " für dich, andere Methode wurde bereits genannt.

Ja, ein Array, erste Länge gegeben, zweite “dynamisch”, ist ebenso möglich.