ArrayList<String> und ArrayList<String[]>

Status
Nicht offen für weitere Antworten.
H

hakoe

Gast
Hallo Freunde,

ich brauche dringd den Tritt, der mir auf die Sprünge hilft.
foldendes Problem:
Ein ArrayList<String> zu befüllen funtioniert wie erwartet.
Ein ArrayList<String[]> zu befüllen klappt (bei mir) nicht!
So dachte ich,geht es:
Code:
    ArrayList<String[]> liste=new ArrayList<String[]>();
    String[] zeile=new String[2];
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile[0]="Zeile"+(i+1);
        zeile[1]="Test"+(i+1);
        liste.add(zeile);
   }
Der Compiler frisst es, die Laufzeitumgebung frisst es.
Und wie ist das Ergebnis?
Alle (!!) Elemente der ArrayList enthalten die Daten des zuletzt ausgeführten liste.add(zeile).
W A R U M ?

Ratlose Grüsse
hakoe
 
S

SlaterB

Gast
weil du mit
liste.add(zeile);
ständig dasselbe Objekt einfügst,
nirgendwo zwischendurch kann man 'new String[]' lesen
 
H

hakoe

Gast
Danke für so schnelle Reaktionen.
Lasst mich mal nachdenken.
Ich melde mich dann nochmal.
 
G

Gast

Gast
So einfach sehe ich das aber nicht, denn wie gesagt:
Mit einem einfachen String funktioniert es bei gleicher Formulierung wie erwartet

Code:
    ArrayList<String[]> liste=new ArrayList<String[]>();
    String zeile=new String;
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile="Zeile"+(i+1);
        liste.add(zeile);
   }

hakoe
 
S

SlaterB

Gast
weil du hier
zeile=irgendwas
schreibst;

bei der Array-Variante ist aber nirgendwo
zeile=irgendwas
zu lesen

vergleiche
zeile = ..;
mit
liste.add()
oder
liste.set()

nur weil du ein Element des Arrays (oder der Liste) bearbeitest,
wird deswegen doch nicht auf einmal ein neues Objekt erstellt,
zum Glück nicht..
 
H

hakoe

Gast
Hallo SlaterB,
in der Array-Variante ist "zeile=irgendwas " zu lesen.
Und zwar zeile[0]= ...
zeile[1]=...
da zeile ein Array der Grösse 2 ist.
Wenn ich jetzt nach dem ersten Listing
3 Durchläufe mache (count=3), so wird zeile folgendermassen belegt:
1. Durchlauf: zeile[0]="Zeile1" , zeile[1]="Test1"
2. Durchlauf: zeile[0]="Zeile2" , zeile[1]="Test2"
3. Durchlauf: zeile[0]="Zeile3" , zeile[1]="Test3"

hakoe
 

tfa

Top Contributor
Aber du benutzt immer das selbe Array. Du brauchst für jeden Schleifendurchlauf ein neues.
 
H

hakoe

Gast
Hallo SlaterB,
Das hat's gebracht:

zeile=new String[2];

am Ende des Schleifendurchlaufs.

Code:
    ArrayList<String[]> liste=new ArrayList<String[]>();
    String[] zeile=new String[2];
    int i;
    int count=eine Zahl>0;
    for (i=0;i<count;i++){
        zeile[0]="Zeile"+(i+1);
        zeile[1]="Test"+(i+1);
        liste.add(zeile);
        zeile=new String[2];  //Das ist es
   }

Nochmals vielen Dank

hakoe
 

Saxony

Top Contributor
Hiho,

is eigentlich ganz einfach:

Alle Elemente deiner Liste lässt du auf ein und dasselbe String[] Objekt zeigen!

Somit haben alle (Array)List Elemente den Inhalt des aktuellen String[] Objektes.


So würde es gehen:
Code:
ArrayList<String[]> liste=new ArrayList<String[]>(); 
		String[] zeile;
	    int i; 
	    int count=3; 
	    for (i=0;i<count;i++){ 
	        zeile = new String[2];
	    	zeile[0]="Zeile"+(i+1); 
	        zeile[1]="Test"+(i+1); 
	        liste.add(zeile);
	   }

Wenn du nur String nimmst, erzeugt ein zeile="Zeile" + (i+1) implizit eine neues String Objekt! Bei Verwendung eines String-Arrays musst du explizit new verwenden.

[edit]
Warst schneller! ;)
[/edit]

bye Saxony
 
H

hakoe

Gast
Ich habe wohl über die Art der Zuweisung und des Kopierens von Objecten
nicht genügend nachgedacht.
Die Sache ist dank Eurer Hilfe nun erledigt.

hakoe
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben