Problem mit einer List

  • Themenstarter Themenstarter mike
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

mike

Gast
hallo, habe dieses kleine Beispielprogramm, das mein Problem vrdeutlicht :
Code:
import java.util.*;

public class test {
	
	
	public static void main(String[] args) {
		List testList = new ArrayList();
		testList.add(new Player("ich"));
		testList.add(new Player("du"));
		testList.add(new Player("er"));
		System.out.println(testList.toString());
		changeList(testList);
		System.out.println(testList.toString());
	}
	
	private static void changeList(List list) {
		List newTestList = new ArrayList(list);
		for (int i=0; i<newTestList.size(); i++) {
			((Player)newTestList.get(i)).name=("test");
		}
	}
}

class Player {
	public String name;

	public Player(String n) {
		name = n;
	}
	
	public String toString() {
		return name;
	}
}

ich möchte in einer Methode (hier changeList) eine List aus der main-Methode benutzen und bearbeiten können, OHNE dass sich die ursprüngliche List ändert. Dies klappt bei mir aber nicht, die ursprüngliche List aus der main-methode wird auch geändert.

Wenn ich das richtig verstehe, wird in der Zeile List newTestList = new ArrayList(list) ein neues Objekt erzeugt und keine Referenz auf die Urprungs-List. Warum wird dann die Ursprungs-List auch geänder? Und wie kann ich das umgehen?

gruß mike
 
hi, Collections.copy() ist dein Freund:

copy

public static void copy(List dest,
List src)

Copies all of the elements from one list into another. After the operation, the index of each copied element in the destination list will be identical to its index in the source list. The destination list must be at least as long as the source list. If it is longer, the remaining elements in the destination list are unaffected.

This method runs in linear time.
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#copy(java.util.List,%20java.util.List)

Falls du beim Zugriff auf einzelne Elemente keine Konstante Zeit brauchst würde ich dir auch eher ne verkettete (linked) Liste empfehlen, da die beim einfügen neuer Elemente einfach besser ist, kommt aber drauf an was du mit deiner Liste anstellen willst 🙂
 
Danke für die Anwort!

Noch eine Frage: gibt es solche Funktion nur für Lists? Wie würde man das mit z.B. einem Vector machen? Habe versucht in meinem Programm ein Vector zu benutzen, es hatte den gleichen Effekt

gruß mike
 
nehme die Frage zurück, habe grade in der API nachgesehen: Vector ist auch eine List! :###

Habe allerdings eine andere Frage, wie benutze ich die Collections.copy() Methode?

Ich habe es so versucht
Code:
List newTestList = new ArrayList(list.size());
Collections.copy(newTestList,list);

Das hat mir die "IndexOutOfBoundsExeption : Source does not fit in dest" gebracht :?

mike
 
Sehr merkwürdig, vergleiche doch mal den Index auf den erschreiben will (steht in der exception) und die Länge der Liste. Vielleicht ein logisches Problem mit dem beginn des array-indizes bei 0?
 
nein, es steht nichts dabei bei der Exeption, nur die Auflistung der Methodn,die daran beteiligt sind.

Es hat sich aber sowieso erübrigt, denn man kann mit Collections.copy() nicht die Objecte der List kopieren, es wird nur die interne Struktur der List kopiert, die Objekte verbleiben die gleichen.

Werde das wohl so machen, dass ich alle Objekte der ersten List auslese, neue (gleiche) Objekte erzeuge und sie in die neue List speichere...

mike
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben