mehrdimensionale ArrayList ?

Status
Nicht offen für weitere Antworten.

Dudu

Mitglied
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:
Code:
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
 
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?
 
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.
 
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
 
Meinst Du es in etwa so?:
Code:
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.
 
Dein Code ist hoffentlich nur Pseudo - Code 😉

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)

Code:
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.
 
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
 
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:
Code:
System.out.println alArray[0].get(0);

führt zu folgendem Ergebnis:
Code:
[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
Code:
alArray[0].get(0).get(0);
gibt es ja leider nicht 🙁

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

Gruß,
Dudu
 
Code:
((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...
 
Dudu hat gesagt.:
Sowas wie
Code:
alArray[0].get(0).get(0);
gibt es ja leider nicht 🙁

Du warst ganz nah dran:
Code:
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.
 
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
 
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.
 
@ 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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben