ArrayList<ArrayList<ArrayList<String>>>

Br4ve

Bekanntes Mitglied
Hallo Leute,
ich bin mal wieder an meine Grenzen gestoßen. Dank diesem "ArrayList<ArrayList<ArrayList<String>>>" schönen Gebilde und zwar liegt mein problem im Zugriff auf die Daten. Mein Beispiel:
Java:
	pstmt.setString(1, pgid);
		rs = pstmt.executeQuery();
		String tmp = "asd";
		
		while(rs.next()){
			ArrayList<ArrayList<String>> listlist = new ArrayList<ArrayList<String>>();
			ArrayList<String> list = new ArrayList<String>();
			if(tmp.equals(rs.getString(9))){
			
				for(int i = 1; i <= 12; i++){
					String tmp2 = null;
					tmp2 = rs.getString(i);
					list.add(tmp2);	
					//System.out.println(tmp2);
				}
				listlist.add(list);
				//System.out.println("add");
				tmp = rs.getString(9);
			}else{
				listlistlist.add(listlist);
				//System.out.println("superadd");
				
				tmp = rs.getString(9);
			
			}
			
		}
Ist wahrscheinlich sehr schwer durchzusteigen. Aber ich erklär mal kurz was ich vorhabe. Auf meine Anfrage er halte ich ein ResultSet mit 12 Spalten, die möchte ich zunächst in eine Liste speichern.
Sind die 12 Spalten abgearbeitet in der For-Schleife, wird die Liste einer weiteren Liste geadded.
Da ich die Elemente mit der gleichen GruppenID alle immer in einer Liste haben möchte passiert dies nur wenn die IDs gleich sind "if(tmp.equals(rs.getString(9)))". Falls eine neue auftaucht wird die Liste wieder einer weiteren Liste hinzugefügt. Man kann sich das so vorstellen, dass die erste Liste meine Prozessschrittbeschreibung beinhalten soll mit den verschiedenen Attributwerten (12). In der übergeordneten Liste liegen alle Prozessschritte und in der darüberliegenden alle Prozesse.
Naja ich hoffe mal das hilft, um sich das vielleicht bildlich ein wenig besser vorzustellen.
Ich habe wie bereits zu sehen, um es auszuprobieren Ausgaben eingefügt. Das sieht auch eigentlich ganz richtig aus.

Jetzt bekomme ich bei dem ausführen dieses Codes jedoch eine Exception:
Java:
for(ArrayList<ArrayList<String>> listlist:
			datenbankZugriff.dbzugriff.anfragetest()){
			System.out.println(listlist.get(0).get(8));
		}

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at tagHandler.test.main(test.java:15)

Kann mir irgendjemand da helfen? Das wäre echt super....
 
G

Gast2

Gast
Das wundert mich kein Stück dass du da Probleme beim Zugriff hast ;) Kannst du da nicht schön mit Objekten arbeiten?

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Der Fehler heißt soviel wie: Die Liste ist leer, du willst aber das erste Objekt rauslesen.
Warum die Liste nicht gefüllt ist weiß ich nicht, ich hab deinen Code nicht nachvollzogen.
 

pl4gu33

Top Contributor
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

bedeutet, dass du auf Index 0 zugreifen willst, aber die Größe der ArrayList 0 ist... also kein Element drin vorhanden ist

[EDIT]zu lahm :D[/EDIT]
 

Br4ve

Bekanntes Mitglied
Das wundert mich kein Stück dass du da Probleme beim Zugriff hast ;) Kannst du da nicht schön mit Objekten arbeiten?
Der Gedanke ist mir auch schon gekommen, aber das ich sowas gemacht habe ist schon ein wenig her, ich fürchte ich bin ein wenig eingerostet :(

Was der Fehler bedeutet ist mir schon klar, allerdings nicht wieso er auftritt ???:L
 
S

SlaterB

Gast
schau doch ganz genau nach, was dein Code macht, was nach dem ersten Durchgang in listlistlist drin ist usw.,
soweit ich das sehe, wird die in jedem Schleifendurchlauf neu erstellte listlist nur im else-Fall in die listlistlist eingefügt,

im if-Fall wird listlist mehr oder weniger kompliziert befüllt, dann aber gleich weggeschmissen, wie gesagt nicht in die listlistlist eingefügt,
ist das dein Ziel?
 
B

bone2

Gast
wie immer: gib dir die listen aus. Logging oder einfaches sysout udn guck was da los ist und wie sie sich ändern
 

Br4ve

Bekanntes Mitglied
Nein, ich habe auch das Gefühl der Code ist fehlerhaft. Mir fällt es allerdings wirklich schwer das zu verstehen. Das Ziel soll sein die erste Liste mit den 12 Spalten aus dem ResultSet zu befüllen. Sobald diese Liste mit der For-Schleife befüllt wurde, soll diese Liste in eine weitere Liste gehen. Diese Liste enthält also einzelne Prozessschritte(Listen) mit 12 Attributen. Also haben quasi alle Elemete dieser zweiten Liste die gleiche ProzessID, weil es einzelne Schritte für einen großen Prozess sind. Sobald sich allerdings die ProzessID ändert, soll diese Liste wiederrum in eine dritte Liste gelegt werden, die die einzelnen Prozesse anthält. Kann man sich darunter etwas vorstellen?
 
S

SlaterB

Gast
listlist und list müssen außerhalb angelegt werden, dann bleiben sie über die Schleifenschritte erhalten,
genau bei einem Wechsel/ genau bei Einfügen in übergeordnete Liste, muss die untere Variable mit einem neuen leeren Listen-Ojekt befüllt werden,

außerdem immer an das Ende denken, nach der Schleife noch alle vielleicht offenen Zustände abarbeiten, in höhere Liste einfügen wenn nicht leer usw.
 

Br4ve

Bekanntes Mitglied
Wenn ich dich richtig verstanden habe, entspricht das diesem Code:
Java:
ArrayList<ArrayList<String>> listlist = new ArrayList<ArrayList<String>>();
		ArrayList<String> list = new ArrayList<String>();
		while(rs.next()){
		
			if(tmp.equals(rs.getString(9))){
			
				for(int i = 1; i <= 12; i++){
					list.add(rs.getString(i));	
					//System.out.println(tmp2);
				}
				
				listlist.add(list);
				list = new ArrayList<String>();
				//System.out.println(listlist.get(0));
				tmp = rs.getString(9);
			}else{
				listlistlist.add(listlist);
				//System.out.println("superadd");
				listlist = new ArrayList<ArrayList<String>>();
				tmp = rs.getString(9);
			
			}
Ich bekomme allerdings noch den gleichen Fehler
 
S

SlaterB

Gast
zu
außerdem immer an das Ende denken, nach der Schleife noch alle vielleicht offenen Zustände abarbeiten, in höhere Liste einfügen wenn nicht leer usw.
hast du gleich eine Ausnahme von IMMER gefunden? nicht schlecht

freilich ist damit nur ein Teil etwas angefangen, weitere Fehlerquellen gibt es genug,
fange mit Logging an: was ist tmp vorher? was ist tmp beim Durchlauf jeweils, wie oft wird der else-Fall durchlaufen,
was machst du mit listlist nach der Schleife, wie groß ist listlistlist am Ende?
 

Neue Themen


Oben