# add-Methode für verschachtelte ArrayLists



## TimeIsTheKey (30. Nov 2010)

Hallo,

ich habe (mal wieder) ein Problem. Ich habe ArrayListen die ineinander verschachtelt sind. Das sieht etwa so aus:


```
ArrayList<ArrayList> array1,array2,array3;
ArrayList<String> array4;
...
array1 = new ArrayList<ArrayList>();
array2 = new ArrayList<ArrayList>();
array3 = new ArrayList<ArrayList>();
array4 = new ArrayList<array4>();
...
array3.add(array4);
array2.add(array3);
array1.add(array2);
...
// Beispiel einer get-Methode
    public String getEtwasAusArray4(int ind1,int ind2,int ind3,int ind4){
    	String inhalt = new String();
    	inhalt = (String)((ArrayList)((ArrayList)((ArrayList)theme.get(ind1)).get(ind2)).get(ind3)).get(ind4); 
    	return inhalt;
    }
```

Mich würde nun brennend interessieren wie ich hier eine add-Methode mache. :bahnhof:

Ich habs mal so versucht, aber es klappt nicht:

```
public void setEtwasInArray4(String detailx,int ind1,int ind2,int ind3,int ind4){
    	((ArrayList)((ArrayList)((ArrayList)theme.get(ind1)).get(ind2)).get(ind3)).detail.add(detailx);
    }
```

Sind eigentlich verschachtelte Arrays das gleiche wie mehrdimensionale Arrays?
Hoffe jemand hat irgendwann mal die gleichen (dummen) Fehler wie ich gemacht ^^"

MfG SurviveX


----------



## SlaterB (1. Dez 2010)

> array4 = new ArrayList<array4>();

ArrayList<String> ?

-----

> [..] theme.get(ind1)).get(ind2)).get(ind3)).detail.add(detailx)

was ist denn das erste 'detail' darin?
und was ist die Fehlermeldung, was klappt nicht?


----------



## Gast2 (1. Dez 2010)

Also die Datenstruktur ist recht... ehm... bescheiden möcht ich mal sagen.
Was wollst du damit denn repräsentieren? Spricht was dagegen daraus schöne Objekt zu machen?


----------



## TimeIsTheKey (1. Dez 2010)

SlaterB hat gesagt.:


> > array4 = new ArrayList<array4>();
> 
> ArrayList<String> ?
> 
> ...



Ach sorry, hab da beim Instanzieren einen Fehler gemacht.Sollte natürlich array4 = new ArrayList<String>(); heissen (hab alles aus dem Gedächtnis reingetippt ). Weiter unten eine ausführliche Beschreibung damit ihr mich auch versteht.



EikeB hat gesagt.:


> Also die Datenstruktur ist recht... ehm... bescheiden möcht ich mal sagen.
> Was wollst du damit denn repräsentieren? Spricht was dagegen daraus schöne Objekt zu machen?



Ich möchte ein Programm schreiben das aus einer Zeilen einliest und alles speichert. Die Inputdatei sieht folgendermassen aus (ein Beispiel):

```
1Thema1
2Kapitel1
3Frage1;Antwort1;Bildpfad1
3Frage2;Antwort2;Bildpfad2
2Kapitel2
3Frage1;Antwort1;Bildpfad1
1Thema2
2Kapitel1
2Kapitel2
3Frage1;Antwort1;Bildpfad1
```

Erklärung: In einem File sollen Themen, Unterthemen und die dazugehörigen Fragen sequentiell runtergelesen werden und in einem multidimensionalen ArrayList gespeichert werden. Jedes Thema (falls es eins gibt...) kann 1 - x Unterthemen haben. Jedes Unterthema kann 1 - x Fragen haben. Und jede Frage ist mit CSV in Frage,Antwort und Bildpfad (Pfad enes normalen .jpg-File) unterteilt. Das Inputfile sollte so gegliedert werden:

```
Inhalt
  ->Thema1
    ->Kapitel1
      ->Frage1
      ->Frage2
    ->Kapitel2
      ->Frage1
  ->Thema2
    ->Kapitel1
    ->Kapitel2
      ->Frage1
```

In Java würde sähe obige Struktur etwa so aus:

```
array1
  ->array2
    ->array3
      ->array4
        ->String1
        ->String2
        ->String3
      ->array4
        ->String1
        ->String2
        ->String3
    ->array3
      ->array4
        ->String1
        ->String2
        ->String3
  ->array2
    ->array3
    ->array3
      ->array4
        ->String1
        ->String2
        ->String3
```

Ich hoffe ich konnte es verständlich schreiben und das ihr mir nachgekommen seit. 

Soooo nun zu meinem Problem. Wäre ich nun das Programm und würde das als Input bekommen würde ich sobald ich im Input 1 bekomme ein array2 in array1 adden (also array1.add(array2)). Bei Index 2 würde ich es in das Thema darüber setzen, aber wie mache ich das? Ich kann ja nicht einfach ein array2.add(array3) machen. Ich brauche also im Klartext Hilfe bei der add-Methode. Ich muss der ArrayListe ja irgendwie mitteilen das ich array3 in das array2 unter Index xy(bei der 2. Zeile z.B. 0) adden möchte. Ich hoffe ihr habt es verstanden.

Um weiterführende Fragen vorgängig zu beantworten:
Ich benutze ein Textfile, weil ich es später einfach jemandem als .zip-Datei schicken möchte und das sollte dann benutzbar sein. Ich habe von einer embedded DB und von XML-Files gehört. Dies wären die nächsten Schritte, aber ich möchte es zuerst mit einem Textfile lösen da die knifflige Aufgabe wahrscheinlich meinem Lernfortschritt zugute kommt. Falls ihr gute, bessere Denkansätze habt würde ich die sehr gerne hören, aber vorrangig will ich die Aufgabe nach meiner Idee realisieren und erst dann eure Denkansätze als weitere Versionen verwirklichen. Ich bin mir zu 99% sicher das die Aufgabe nach meinem Vorgehen lösbar ist.

MfG


----------



## SlaterB (1. Dez 2010)

du hast nun das Problem, Unmengen an Daten an den richtigen Stellen einzusortieren, ok, 
mit der Frage oben speziell zum Code von 'setEtwasInArray4' scheint das nicht mehr so direkt zu tun zu haben, 
dann eben was neues, den Text Zeile für Zeile parsen

Anfang:
ArrayList der Themen (t) erstellen 
> 1Thema1
neues Thema, neue Liste der Kapitel erstellen (k), k in t einfügen,
> 2Kapitel1
neues Kapitel, neue Liste der Fragen erstellen (f), f in k einfügen,
> 3Frage1;Antwort1;Bildpfad1
eine erste Frage, diese komplett als String in f einfügen, schöner wäre an dieser Stelle vielleicht ein Objekt einer Klasse Frage mit 3 Strings zu erzeugen, 
kann auch später passieren
> 3Frage2;Antwort2;Bildpfad2
neue Frage, kein Problem, weiter in f einfügen
> 2Kapitel2
neues Kapitel, neue Liste der Fragen erstellen (f), f in k einfügen,
dass es vorher schon ein f gab ist kein Problem, diese Liste ist im ersten k an Position 0,
die neue f-Liste wird automatisch ans Ende an Index 1 eingefügt
> 3Frage1;Antwort1;Bildpfad1
ganz normal die Frage in f einfügen, f ist die aktuell richtige Liste, wo das in welchem Kapitel in welchem Thema steht ist hier vollkommen egal
> 1Thema2
locker leicht neue Liste k erstellen, in t einfügen,
mit dem alten k gibts kein Problem, ist in t drin, wird sonst nicht mehr benötigt die aktuelle Liste f ist noch für ein altes Thema/Kapitel,
aber das stört nicht, bevor wieder eine Frage kommt dürfte bei korrekter Verschachtelung erst noch ein Kapitel kommen, daher eine neue f-Liste angelegt werden
> 2Kapitel1
und da ist schon ein Kapitel, für dieses eine f-Liste erzeugen und in k einfügen
> 2Kapitel2
und noch mal neues f, dass die vorherige Liste leer bleibt ist nicht unbedingt ein Problem

usw.
am Ende hast du deine Listen, 
statt t, k, f kannst du auch gerne wieder deine Namen array1, array2, array3 einsetzen, wenn du das übersichtlicher findest,
array4 ist bisher nicht zu sehen, nur 3 Ebenen machen Sinn bei Themen, Kapitel + Fragen

edit: ok, es ist genauso denkbar denkbar, die Fragen-Strings zu splitten, eine dreielementige Liste darauf zu machen und diese Liste dann in f einzufügen


falls die Kapitel außer Zahlen, die zurückrechenbar sind, noch richtige Namen haben, dann werden diese beim derzeitigen Ansatz nirgendwo gemerkt,
grundsätzlich ist es besser, statt nur Listen richtige Objekte zu bauen,
z.B. eine Klasse Thema mit einer Liste für Objekte der Klasse Kapitel, in solchen Klassen ist es dann auch leicht, eine zusätzliche String-Variable für den Namen des Themas zu speichern oder ähnliches


----------



## TimeIsTheKey (2. Dez 2010)

Hey, vielen Dank für die Überlegung. Ich glaube aber das wir eventuell ein bisschen aneinander vorbeigeredet haben. Ich war mir durchaus bewusst wie ich die Struktur in den Listen realisiere (Zeile für Zeile parsen und richtig einfügen). Das Problem ist wirklich die Methode 'setEtwasInArrayxy'. Ein neues Thema zu erstellen und dieses mittels add einzufügen ist ja leicht. Mein Problem ist nun z.B. das einfügen von Kapiteln/Fragen. Ich muss in der add Methode irgendwie auf das Objekt auf dem Index xy verweisen. Ich habe keinen blassen Schimmer wie das funktionieren soll und auch eine intensive Suche hat mir nicht weitergeholfen. Eventuell wirst du verstehen was ich meine wenn du dir das hier ansiehst(habs mal mit deinem Ablauf gemacht, wird für dich leichter verständlich sein ^^):

Anfang:
ArrayList der Themen (t) erstellen --> Hier wird die Liste t instanziiert
> 1Thema1
neues Thema, neue Liste der Kapitel erstellen (k), k in t einfügen, --> Hier mache ich t.add(k) -> k wird unter dem Index 0 in t zu finden sein
> 2Kapitel1
neues Kapitel, neue Liste der Fragen erstellen (f), f in k einfügen, -> Hier taucht auch schon das Problem auf. Wie sieht das add dafür aus? k.add(f) funktioniert nicht, ich muss ja sagen das das k im ArrayList t unter dem Index 0 ist. --

Und vielen Dank zum Denkansatz mit den Objekten. Ich werde das gleich mit den Objekten realisieren. Es kam mir zwar in den Sinn, aber ich sah keinen grossen Vorteil darin, obwohl ich bemerkte das ich 2 Zusatz-ArrayListen für die Namen machen müsste. Erleichtert mir es. Vielen Dank ^^ (Gibt gleich an Danke ^^)


----------



## SlaterB (2. Dez 2010)

SurviveX hat gesagt.:


> > 2Kapitel1
> neues Kapitel, neue Liste der Fragen erstellen (f), f in k einfügen, -> Hier taucht auch schon das Problem auf. Wie sieht das add dafür aus? k.add(f) funktioniert nicht, ich muss ja sagen das das k im ArrayList t unter dem Index 0 ist. --


wenn du in Reihenfolge vorgehst, dann ist k eine lokale Variable genau mit der aktuell richtigen Liste,
wie ich es bei mir beschrieben habe, einfach k.add(f)

wenn du die Variablen nicht merkst oder später an beliebiger Stelle im Baum einfügen möchstet,
dann musst du eben den Index wissen,

aus 
> 2Kapitel1
kann man nicht direkt erkennen, diese Zeile kommt exakt so ja auch mehrfach in deinem Beispiel vor,
ob es das erste oder zweite Thema ist musst du aus anderen Informationen merken und wenn die Indexe bekannt sind, dann ist es ja nicht schwer,
so wie du in deiner getEtwasAusArray4-Methode mehrere Indexe hast


----------



## ARadauer (2. Dez 2010)

Im Grunde will ich mir das jetzt gar nicht genau ansehen...

```
inhalt = (String)((ArrayList)((ArrayList)((ArrayList)theme.get(ind1)).get(ind2)).get(ind3)).get(ind4);
```
= selber Schuld
wozu gibts den Objekte? Man kann sich das Leben schon selber schwer machen!


----------



## TimeIsTheKey (2. Dez 2010)

SlaterB hat gesagt.:


> wenn du in Reihenfolge vorgehst, dann ist k eine lokale Variable genau mit der aktuell richtigen Liste,
> wie ich es bei mir beschrieben habe, einfach k.add(f)
> 
> wenn du die Variablen nicht merkst oder später an beliebiger Stelle im Baum einfügen möchstet,
> ...



Ach, ich glaube ich drücke mich einfach zu ungenau aus. 
Kannst du mir mal zeigen wie so ein add aussieht? Also wenn ich z.B. ein Kapitel in ein Thema reinadde. Ich weiss wie ich die Indexe später zu steuern habe, aber ich weiss nicht wie ich da mit einem Index reinadde. Es ist ja kein normales add mehr möglich. Ich hab es nämlich versucht so ähnlich wie in der get-Methode zu machen, aber es klappt nicht und ich weiss genau an dieser Stelle nicht mehr weiter. Klartext: Ich würde gerne wissen wie die add-Methode aussehen würde wenn mir die Indexe bekannt sind.



ARadauer hat gesagt.:


> Im Grunde will ich mir das jetzt gar nicht genau ansehen...
> 
> ```
> inhalt = (String)((ArrayList)((ArrayList)((ArrayList)theme.get(ind1)).get(ind2)).get(ind3)).get(ind4);
> ...



Ich werde später anpassen und es mit Objekten realisieren. Allerdings frage ich mich wieso du gerade die get-Methode zitierst. Die wird in der Objekt-Klasse genau gleich aussehen, weil man anders kein get realisieren kann. Denn einzigen Vorteil den ich da jetzt sehe ist das ich gleichzeitig den Namen speichern kann und nebenbei keine weitere ArrayLists für die Namen habe.


----------



## SlaterB (2. Dez 2010)

SurviveX hat gesagt.:


> Klartext: Ich würde gerne wissen wie die add-Methode aussehen würde wenn mir die Indexe bekannt sind.


ganz normal, so wie man es sich auf die natürlichste Weise denken kann,
welche Fehler du genau hast frage ich seit Anfang an ohne Antwort, 

hier ein Beispiel, ob die Index- und Array-Benennung richtig ist ist gewohnt fraglich,
aber das magst du ja so gerne


```
class CrazyTree {
    private ArrayList array1 = new ArrayList();

    void add2(ArrayList array2)
    {
        array1.add(array2);
    }

    void add3(int index1, ArrayList array3)
    {
        ((ArrayList)array1.get(index1)).add(array3);
    }
    // add4, add5 usw
}
```


----------



## TimeIsTheKey (2. Dez 2010)

Ich hab mehrmals versucht zu fragen wie die Methode geht, aber anscheinend war ich wirklich zu ungenau wenn man das nicht sofort herauslesen konnte. 
Das war genau das was ich suchte :toll:

PS: Die Bezeichnungen habe ich angepasst, ich dachte das man es mit allgemeinen Begriffen wie Array besser verstehen würde als spezifische wie Thema oder Kapitel ^^


----------

