.add(E) für mehrdimensionale Vectoren

Tembudrus

Mitglied
Hallo,

ich habe ein kleines Verständnisproblem mit meinem Programm.

Ich habe mir eine Methode geschrieben, die aus einer Datei jede Zeile ausließt und diese Zeile dann in einem Element eines

Java:
 Vector <String>

abspeichert. Eine weitere Methode soll sich nun jede Zeile vornehmen und jedes einzelne Wort in einem Mehrdimensionalen Vektor der Art

Java:
 Vector <Vector <String>>

speichern. Diese Methode sieht folgendermaßen aus.

Java:
private Vector <String>	file_content =new Vector <String> ();
private Vector <Vector <String>> split_file_content = new Vector <Vector <String>> (); 

// file_content wurde bespielt, keine Probleme hier

public void setsplit_file_content(){
	Vector <String> buffer = new Vector <String> ();  // Ein String buffer
	String line;
	int i = 0, j;
	while(i < file_content.size()){   //Für jede Zeile der Anfangsdatei
		buffer.clear();
		j = 0;
		line = file_content.get(i);
		String[] words = new String[1024];  // Länger sollte die Zeile nicht sein  
		try{
		words = (line.split("\\s"));}  // Schreibt in jedes Element ein Wort
		catch(PatternSyntaxException e){System.out.println("split() did not work");}
		while(j < words.length)   // macht quasi aus dem String-Array einen Vektor vom gewünschten Typ
		{
			buffer.add(words[j]);
			j++;
		}
		split_file_content.add(buffer);  // !!!!!Hier ist der Fehler (siehe unten)!!!!!
		i++;
		}

	}

Wenn ich mir nun aber meinen mehrdimensionalen Vector split_file_content ansehe, so steht in JEDEM Element des äußeren Vectors (sooft wie die Datei Zeilen hatte) die letzte Zeile der Datei in Wörter gebrochen. Offensichtlich schreibt die Methode add(buffer) nicht nur in ein neues Element am Ende des äußeren Vectors einen Vector <String> sondern auch in alle die davor bereits existierten.

Frage: WARUM? ???:L

Ein Beispiel. Wenn meine Datei folgendermaßen aussieht:

1Zeile 1
2Zeile 2
3Zeile 3
4Zeile 4
5Zeile 5

Und ich mir dann immer abwechselnd eine Zeile, dann das erste Wort dieser Zeile, die nächste Zeile, das erste Wort dieser Zeile etc. ausgeben lasse, sollte die Ausgabe:

1Zeile 1
1Zeile
2Zeile 2
2Zeile
3Zeile 3
3Zeile
4Zeile 4
4Zeile
5Zeile 5
5Zeile

sein. Ich erhalte aber:
1Zeile 1
5Zeile
2Zeile 2
5Zeile
3Zeile 3
5Zeile
4Zeile 4
5Zeile
5Zeile 5
5Zeile
 
Offensichtlich schreibt die Methode add(buffer) nicht nur in ein neues Element am Ende des äußeren Vectors einen Vector <String> sondern auch in alle die davor bereits existierten.

Frage: WARUM?
Weil Du immer wieder den selben Vector leerst wieder befüllst usw.
=> In dem Vector<Vector <String>> wird also x-mal auf den selben Vector<String>
Lösung: statt den "alten" Vector buffer jedesmal wieder zu verwenden immer einen neuen Vector erzeugen.

Allgemein verwendet man heutzutage mehr List Objekte z.B. ArrayList anstatt Vectoren.
 
Wenn ich buffer.clear() auskommentiere verändert sich das Problem nicht wirklich. Es wird noch immer der Inhalt von buffer in alle Elemente von Vector <Vector <String>> geschrieben.
Buffer hat ja gerade die Aufgabe als Vector <String> in jedem Element ein Wort einer Zeile aufzunehmen. Von daher halte ich das Löschen des Inhaltes beim Abarbeiten einer neuen Zeile des Ausgangsdokumentes für richtig.

Das Problem besteht somit immer noch :rtfm: . Aus irgend einem Grund hängt add nicht nur ein Element an Vector <Vector <String>> an, sondern füllt alle vorherigen Elemente mit den Werten des zuletzt angehängten Elementes auf.

Zu Vector <E obj>:
Der Vector <E obj> ist doch eine abgeleitete Klasse von AbstractList. Von daher, dachte ich gäbe es hier weniger Probleme als mit den "alten Vektoren".
 
Das Problem besteht somit immer noch :rtfm: . Aus irgend einem Grund hängt add nicht nur ein Element an Vector <Vector <String>> an, sondern füllt alle vorherigen Elemente mit den Werten des zuletzt angehängten Elementes auf.
Siehe meinen Lösungshinweis: statt den alten zu leeren jedesmal einen neuen Vector erzeugen. Auskommentieren des clear() löst das Problem natürlich nicht.
 
Vielen Vielen Dank!!! So funktioniert es nun.

Vielleicht noch eine Frage zum Verständnis. Ich würde mir meinen Fehler jetzt so erklären, dass ich gar nicht die Werte von buffer, sondern nur die Adresse von buffer übergeben habe. Kann ich mir dies so vorstellen? Quasi Call by reference statt Call by value.
 
Naja, in Java gibt es kein Call by Reference.
Es wird eine Kopie der Reference "by Value" übergeben.

Sehe gerade ich hab im ersten Post ein Wort vergessen 😳 :
=> In dem Vector<Vector <String>> wird also x-mal auf den selben Vector<String> referenziert
 

Zurück
Oben