Wenn i == durchlauf-1 bekommst du das entsprechende Zahlenfeld - genauso wie du es in der ArrayList abgelegt hast. Willst du die durchlauf-1ste Zahl des i. Zahlenfelds abfragen, schreibst du
Code:
meineListe.get(i)[durchlauf-1]
Mit ein bißchen mehr Code und ein wenig mehr Info darüber, was um alles in der Welt du da eigentlich machst, muss ich nicht so im Trüben fischen und kann dir effektiver helfen - aber vielleicht reicht das ja schon...
Also geht darum Lottozahlen zu ziehen und dann die Ziehungsnummer samt Array mit den pro Ziehung gezogenen Zahlen in eine ArrayList oder LinkedList zu packen.
Es soll dann über einen Button die komplette Liste in der Konsole und später in einen Textfeld ausgegeben werden.
1 2 43 23 22 12 13 44
.
.
.
Hier sind die Methoden für hinzufügen und auslesen der Liste:
Code:
public void Add2List(int[]a){
int [] zahlenfeld = a;
meineListe.add(durchlauf-1, zahlenfeld);
1. Ist es Absicht, das deine Konsolenausgabe sieben Zahlen ausgibt (wenn man die führende 1 als Nummer der Ziehung interpretiert)? Ich denke hier an 6 aus 49 plus Superzahl, die Frage ist also ernstgemeint.
2. durchlauf ist eine Instanzvariable? Oder bekommst du schon Compilerfehler, weil durchlauf nicht deklariert wurde?
3. Was nützt dir ein Iterator, wenn du in dann doch nicht benutzt?
4. Die Nummer deiner Ziehung wird NICHT in der ArrayList gespeichert. Stell dir die ArrayList als eine Reihe von Kisten vor, in die du deine Werte ablegst. Als Konvention hast du und der "Lagerarbeiter", der dir die Kisteninhalte auf Anforderung holt, vereinbart, das mit der Zählung der Kisten immer von links begonnen wird und neue Werte immer in die erste nie belegte Kiste oder in die Kiste, die du ansagst, gelegt wird. Wenn du also drei Zahlenfelder in die (bislang leeren) Kisten legst und dementsprechend drei mal sagst "Lege diesen Wert in die nächste freie Kiste!", kannst du dir sicher sein, das das erste Feld in die erste Kiste von links kommt, das zweite in die zweite Kiste usw.
Moral der Geschicht': Deine auslesen-Methode sollte so aussehen:
Code:
public void GetList(){
// Sehr gut, der richtige Gebrauch von Iteratoren ist wichtig für Java!
Iterator <int[]> it = meineListe.iterator();
// Wenn wir einen Iterator nutzen, soll auch dieser entscheiden
// dürfen, wann er keine Werte mehr liefert. Die Variable i
// brauchen wir trotzdem.
for(int i=0; it.hasNext(); i++){
// Kisten und Konventionen und so ...
System.out.print(i + ". Ziehung: ");
// Iterator arbeiten lassen
int[] zahlenfeld = it.next();
// zahlenfeld.length ist flexibler und leichter verständlich
// Das j++ in den Schleifenkopf und nicht in den Rumpf
// zu schreiben ebenso!
for(int j=0; j<zahlenfeld.length; j++){
// Wenn ich das Zahlenfeld schon habe, sollte ich es
// auch verwenden.
System.out.print(" " + zahlenfeld[j]);
}
System.out.println();
} // Fehlende Klammer ergänzt
}
mpG
Tobias
P.S.: Wo ich schon von Konventionen und so erzähle: Methodennamen schreibt man klein und in CamelCase. Methodennamen, die mit get beginnen, werden per Konvention benutzt, um Referenzen auf Instanzvariablen zurück zu liefern, eine get-Methode mit void-Rückgabetyp ist also ein klarer Verstoß gegen diese Konvention. Da du darüberhinaus eine Ausgabe auf die Kommandozeile machst, solltest du überlegen, ob du die Methode nicht lieber printList() oder ähnlich nennst.
Sowas wie "variable Variablennamen" gibt es nicht in Java. Du kannst ein Array benutzen (wenn du im Vorraus weißt, wieviele Variablen du brauchst) oder eine Collection wie die von dir ja schon eingesetzte ArrayList.
Textfelder können nur einzeiligen Text ausgeben, für mehrzeiligen mußt du TextArea verwenden.
Ein Zeilenumbruch bekommst du, indem du die Steuerzeichensequenz \n für newline verwendest.
Am einfachsten kannst du ein int[] in einen String umwandeln, in dem du die Methode toString() der Utility-Klasse Arrays verwendest. Etwa so:
Code:
import java.util.Arrays;
class Foo {
private int[] meinArray = new int[6] { 1, 2, 3, 4, 5, 6};
public void ausgeben {
String meinString = Arrays.toString(meinArray);
// weiteres hier ...
}
}
Oder du schreibst dir eine eigene Methode zum Umwandeln, die den Array iteriert und die einzelnen Elemente einem String hinzufügst. Hier solltest du aber mal nach StringBuilder bzw StringBuffer suchen, damit geht das deutlich performanter (auch wenn das für dein Mini-Problem keine Rolle spielt).
Ah, da war ich voreilig. Neben der setText()-Problematik uberschreibst du nämlich auch deine String-Referenz bei jedem Schleifendurchlauf:
Code:
public void ShowList(){
//this.setSize(400, 400);
Iterator <int[]> it = meineListe.iterator();
for(int i=0;it.hasNext();i++){
int[] zahlenfeld = it.next();
String meinString = ""; // Objektreferenz hier deklarieren, da sie innerhalb
// der Schleife immer wieder überschrieben würde.
for(int j=0; j<zahlenfeld.length; j++){
// String zusammenbauen
meinString = meinString + (i+1) + ". Ziehung: " + Arrays.toString(zahlenfeld) + "\n";
}
// Jetzt alles in die Textarea kippen
meineTextJTextArea.setText(meinString);
// System.out.println()? Du gibst doch nichts mehr auf der Konsole aus...
}
}
mpG
Tobias
P.S.: Dein Kommentar zu it.next() ist übrigens falsch. Es handelt sich dabei nicht um ein Objekt, sondern um einen Methodenaufruf, der ein Array zurückgibt. Das aber nur am Rande, denn im großen und ganzen machst du das ziemlich gut.
Das hängt vom verwendeten LayoutManager ab. Du kannst dem LayoutManager vorschlagen, wie groß die Komponente dargestellt werden soll - dafür gibt es setPreferredSize(). setSize() wird vom LayoutManager benutzt, um der Komponente die letztendliche, tatsächliche Größe mitzuteilen - deine Änderungen hier werden also sofort vom LayoutManager überschrieben.
Bessere Hilfe bekommst du, wenn du Code postest (und vielleicht einen neuen Thread im AWT und Swing-Board eröffnest, weil das hier arg offtopic wird).