# mehrdimensionale ArrayList ?



## Dudu (18. Mai 2005)

Hallo zusammen,

ich muss mehrere verschiedene Daten aus verschiedenen Dateien zur späteren Weiterverarbeitung einlesen. Zur Speicherung würde ich gerne eine "mehrdimensionale" ArrayList benutzen. Ich weiss, dass es sowas eigentlich nicht gibt, aber dass es möglich ist in einer ArrayList eine neue ArrayList zu erzeugen. Aber ich komme nicht drauf wie das gehen soll bzw. wie ich die Elemente ansprechen kann :cry: 

Beispielcode bis jetzt:

```
public static void basicDataIn () {

// Initialisierung von ArrayList basisData mit 13, da maximal nur 13  zu
// vergeben sind, in diesen werden unbegrenzte ArrayList angelegt.
	basisData = new ArrayList [13];
...
	
	for ( int i = 0; i < assembly.length; i++) 
	{
		basisData[i] = new ArrayList();
		....		
		try {
	                ...
			while ((read_1 = readFile_1.readLine()) != null){
				basisData[i].add(new ArrayList());
				}
			}
			readFile.close();
		....
		}
	}
}
```

Im Prinzip muss ich in die ArrayList aus Zeile 11 mehrere ArrayListen erzeugen und diese mit Daten befüllen. Wie mache ich das nun?

Danke für Antworten im voraus.

Gruß,
Dudu


----------



## mic_checker (18. Mai 2005)

willst du nun eine ArrayList gefüllt mit ArrayList oder ein eindimesionales Array von ArrayList?


----------



## Dudu (18. Mai 2005)

OK, ich sehe ich muss mehr Informationen geben  :wink: 

Ich will ein eindimensionales Array mit der Größe 13, in welcher sich 13 ArrayList befinden.  Kein Problem. In den jeweiligen ArrayList möchte/muss ich einen verschiedene Anzahl von neuen ArrayList unterbringen/erzeugen. 
In etwa so:
basisData_ -> new ArrayList() -> new ArrayList()
                                              -> new ArrayList()
                                              -> new ArrayList()
                                              ....

Geht das?_


----------



## mic_checker (18. Mai 2005)

Klar - das geht schon.

Einfach die einzelnen ArrayList im Array richtig initialisieren und danach kannst du mit add die einzelnen ArrayList hinzufügen.

Ist zwar nicht sonderlich schön, sollte aber kein Problem darstellen.


----------



## wro (18. Mai 2005)

Hallo Dudu,

was macht man, wenn es in einer objektorientierten Entwicklungsumgebung etwas nicht gibt, das man gerne hätte?

Man bastelt es sich aus den vorhandenen Komponenten mit möglichst geringem Aufwand selber zusammen.

Ich würde an deiner Stelle das ganze in einer neuen Klasse kapseln. Innerhalb der Klasse kannst du dann genau wie du es vorhast eine ArrayList anlegen, die widerum ArrayListen enthält. Das du jetzt in der einen Dimension gerade mal 13 Elemente benötigst, würde ich mal vernachlässigen. Eine ArrayList kann fast beliebig viele Objekte aufnehmen. Auch die zweidimensionale ArrayListe sollte deshalb fast beliebig Objekte in beiden Richtungen indizieren können. Dadurch steigt der Grad der Wiederverwertung. Falls du mal wieder ein solches Objekt gebrauchen solltest, aber diesmal z.B. 24 x 454554 groß. Was machst du dann? Fängst du wieder von vorne an?

Wenn die Größe nicht bekannt ist, dann ist es natürlich schwierig bereits beim Erzeugen der 2-dimensionalen Liste bereits alle inneren ArrayListen anzulegen. Das ist aber auch gar nicht notwendig. Du mußt beim speichern lediglich prüfen, ob für diese Koordinaten bereits intern eine ArrayList exisitiert oder nicht. Falls nicht wird sie eben vorher angelegt. Falls was ausgelesen werden soll von einer Koordinate, die noch nie belegt wurde, wird der Wert null zurückgeliefert.


Gruß

Wolfgang


----------



## Dudu (18. Mai 2005)

Meinst Du es in etwa so?:

```
Array[] basisData = new Array[13];
basisData[i] = new ArrayList();
basisData[i].addArrayList();
basisData[i].addArrayList();
basisData[i].addArrayList();
...
```

Das hatte ich in etwa auch so vor. Aber wie kann ich jetzt zum Beispiel die Elemente der 3. ArrayList von basisData_ ansprechen zum Befüllen oder lesen? Momentan hätte ich ja nur 3 verschiedene ArrayList in basisData.

Wenn Du meinst, dass das Ganze nicht schön sei. Was würdest Du denn vorschlagen? Performance ist momentan nicht so wichtig.

[Edit] Arrg, habe den anderen Beitrag jetzt erst gesehen. Die Daten kommen aus einem SAP-System und es ist vorher nicht bekannt wieviele ArrayListen ich brauchen werde. Soll erst zur Laufzeit generiert und befüllt werden. Ich glaube, es ist fast besser, wenn ich mal ein paar Dateien anonymisiere und poste, damit es klar wird, was ich brauche._


----------



## wro (18. Mai 2005)

Ich sehe gerade, es soll nicht zweidimensional, sondern wirklich mehrdimensional sein?

Wolfgang


----------



## mic_checker (18. Mai 2005)

Dein Code ist hoffentlich nur Pseudo - Code 


```
List[] alArray = new List[13];

//ArrayLists aus Array erzeugen mit new ...

List newList = ....
alArray[0].add(newList);

List anotherList = ....
alArray[0].add(anotherList);

//etc. pp.
```

Hier befüllst du also die erste ArrayList mit weiteren ArrayList.

Darauf zugreifen kannst du ganz normal mit get(int index)


```
alArray[0].get(0);
```

um z.B. die erste ArrayList aus der ersten ArrayList des Arrays zu kriegen.

Um was anderes vorschlagen zu können müsste ich das Problem genau kennen, dann könnte man entscheiden ob eine andere Struktur, bzw. Herangehensweise nicht besser wäre.


----------



## Dudu (18. Mai 2005)

Yep, ist nur Pseudo-Code. Aber er sieht doch so schön aus  :wink: 
Werde es mal so probieren. 

@all Danke für die schnelle und freundliche Hilfe zu der fortgeschrittenen Stunde.

Gruß,
Dudu


----------



## Dudu (20. Mai 2005)

Sorry, dass ich den Thread nochmal aufmachen muss.

Ich habe das ganze jetzt so geschrieben, wie es vorgeschlagen wurde. Klappt auch. Aber ich stehe jetzt vor dem Problem, dass wenn ich die einzelnen "inneren" ArrayLists auslesen will, immer das ganze ausgelesen wird.
Beispiel:

```
System.out.println alArray[0].get(0);
```

führt zu folgendem Ergebnis:

```
[Test, 0, 93, 95, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113]
```
 Ich müsste aber noch nun diese einzelne Elemente von .get(0) ansprechen können. Sowas wie 

```
alArray[0].get(0).get(0);
```
gibt es ja leider nicht   

Geht das überhaupt? Wenn nicht, muss ich es doch anders umsetzen.

Gruß,
Dudu


----------



## mic_checker (20. Mai 2005)

```
((ArrayList)al.get(0)).get(0)
```

wenn du ArrayLists zur ArrayList hinzugefügt hast....

edit:
bin bei meinem code davon ausgegangen das du in der ArrayList al alles drin hast, bei dir musst du halt entsprechend anpassen mit Array...


----------



## Sky (20. Mai 2005)

Dudu hat gesagt.:
			
		

> Sowas wie
> 
> ```
> alArray[0].get(0).get(0);
> ...



Du warst ganz nah dran:

```
System.out.println(((List)alArray[0].get(0)).get(0));
```

Erklärung: List#get gibt ein Object zurück. Dass musst Du erst mal nach List casten.


----------



## Dudu (20. Mai 2005)

Danke für die schnelle Antwort.   
War genau das was ich brauchte. Hatte es zwar auch mit Klammern probiert, aber auf das Casten wäre ich im Leben nicht gekommen. 

Aber irgendwie bekomme ich immer mehr Zweifel, ob dies überhaupt so gut ist bei der Datenmenge, die später mit dem Programm durch die Gegend geschaufelt wird. Muss mich nochmal ans Reißbrett setzen und nachdenken... :### 

Aber ihr habt mir auf jeden Fall den Tag gerettet   :toll: 

Gruß,
Dudu


----------



## mic_checker (20. Mai 2005)

Weiß nicht ob ich es einfach überlesen hab, aber wofür brauchst du das ganze denn ?

Vielleicht könnten wir uns eine andere Lösung überlegen wenn wir genau wüssten wodrum es konkret geht.


----------



## Dudu (20. Mai 2005)

@ mic checker: Dein Angebot ist sehr freundlich, aber wenn ich das Ganze so erkläre, dass Ihr damit etwas anfangen und spezifischer helfen könntet, müsste ich mehrere Seiten füllen. Ist insgesamt ein Projekt/Aufgabe für ein Praktikum. Wenn man es kurz zusammenfassen möchte, geht es um Export (nicht Java) von Daten aus einem DataWarehouse und der versuchten Optimierung des bisherigen Datenmodells (in Java). Bevor jemand sagt, dass C/C++ besser dafür wäre, sage ich nur Anforderungskatalog   :wink: 
Da ich in Java erst eine Vorlesung (absolute Grundlagen) hatte, bin ich mehr auf schlaue Bücher, Internet und so hilfsbereite Menschen wie Ihr angewiesen.

Deshalb für die schon geleistete und wahrscheinlich noch kommenden Fragen meinerseits ein grosses DANKE    

Gruß,
Dudu


----------

