# Java- ArrayList überschreibt Werte eigenständig!



## Hilfe (18. Okt 2006)

Hallo,

ich stehe total auf dem Schlauch. Ich verstehe nicht warum er das tut.   

Beim ersten Durchlauf speichert er an 0er Stelle bei newdata die Daten richtig ab. Meine numsub und ports sind richtig.
Und bei der Bearbeitung vom zweiten Knoten ändert er newdata(0) mit den Daten die eigentlich für newdata(1) bestimmt sind. :bahnhof: Wie kann er newdata an dieser Stelle verändern??? Das verstehe ich nicht...   


```
for (int k = 0; k < nodecategory.size(); k++) {
				String cat = (String) nodecategory.get(k);
				ArrayList newdata = new ArrayList();
				//Vector newdata = new Vector(); 
				
				System.out.println("********************************************************");
				
				ArrayList data = // ArrayList der Daten;
				
				if(data.size() == 0) {continue;}
				
				for (int i = 0; i < data.size(); i++) {
					// Spalte in Verwendung
					ArrayList nd = (ArrayList) data.get(i);
					
					// Knoten hinzufügen
					if(anodegen != null) 
					{	
						ArrayList returnl = addNodes(nd); // Liste mit zusätzlichen Knoten die erst dann generiert werden
					
						ArrayList  newdataadd = (ArrayList) returnl.get(0);
						Integer numsub = (Integer) returnl.get(1);
						Integer ports = (Integer) returnl.get(2);
						
						for (int j = 0; j < nouse.size(); j++) 
						{
							ArrayList no = (ArrayList) nouse.get(j);
							if(no.get(0).equals("NUM_SUBUNITS")) 
							{								
								no.set(1, numsub); // AN DIESER STELLE ÜBERSCHREIBT ER newdata(0)
							} else if (no.get(0).equals("ANZAHLPORTS")) {
								no.set(1, ports); // AN DIESER STELLE ÜBERSCHREIBT ER newdata(0)
							}
							// unverwendete Spalte							
							nd.add(no);
						}
						newdata.add(nd);
						
						// Hinzufügen der Knoten an die ursprüngliche Knotenliste
						for (int j = 0; j < newdataadd.size(); j++) {
							ArrayList ndadd = (ArrayList) newdataadd.get(j);
							newdata.add(ndadd);
						}	
						System.out.println();
					} else {
						for (int j = 0; j < nouse.size(); j++) 
						{
							// unverwendete Spalte
							nd.add(nouse.get(j));
						}
						newdata.add(nd);
					}
					
				}
```

Bin für jede Hilfe dankbar... ???:L


----------



## Leroy42 (18. Okt 2006)

:shock:  :shock:  :shock: 

Versuch' mal eine deutlichere Erklärung am besten mit Zeilennummern
bei denen *was* geschehen soll aber  *was* geschieht.


----------



## SlaterB (18. Okt 2006)

schönes Beispiel für Code, den niemand verstehen soll,
falls du es selber versucht, dann baue evtl. übeall noch 
System.out.println("Variable xy enthält Liste "+liste.hashcode()+", Inhalt: "+liste);
so erkennst du, ob das zweite nd gleich dem ersten ist oder ähnliches,
bei so einem riesigen Code ist das natürlich schwierig, aber besser als nix


----------



## Hilfe (18. Okt 2006)

Habe es gerade selber lösen können.

Immer wenn ich durch

```
no.set(1, numsub);
oder 
no.set(1, ports);
```

die ArrayList verändert habe, haben sich alle anderen ArrayLists automatisch mit verändert. Dadurch hatte ich dann überall diese falschen Werte drin auch in newdata.


```
ArrayList notest = new ArrayList();
						if(no.get(0).equals("NUM_SUBUNITS")) 
						{		
							notest.add("NUM_SUBUNITS");
							notest.add(numsub);
							//no.set(1, numsub);
						} else if (no.get(0).equals("ANZAHLPORTS")) {
							notest.add("ANZAHLPORTS");
							notest.add(ports);
							//no.set(1, ports);
						} else {
							notest.add(no.get(0));
							notest.add(no.get(1));
						}
						// unverwendete Spalte							
						nd.add(notest);
```

löst das zwar ist aber unschön..


----------



## crumble (18. Okt 2006)

ich bin jetzt den quelltext nur kurz überflogen, aber ich glaube, du bist über die tatsache gestolpert, dass ArrayList.add() ein Objekt zur Liste hinzufügt, keine Kopie! Wenn du also

```
String a = "bla";
ArrayList list = new ArrayList();
list.add(a);
a = "test";
list.add(a);
```
verwendest, wird mit dem 2.add das a, was schon in der liste ist, ebenfalls mit "test" belegt und ist somit 2mal in der liste
Besser wäre:

```
ArrayList list = new ArrayList();
list.add(new String("bla"));
list.add(new String("test"));
```

crumble


----------

