# problem mit resultset->arraylist



## kubi (26. Apr 2006)

hoi!

ich hab ein problem mit meinem resultset, dass ich in eine arraylist geschrieben habe.

code:

....

```
try
{
Statement st= conn.createStatement();

...

st.executeQuery("SELECT a, b FROM myTable ORDER BY a,b");

ResultSet rs = st.getResultSet();

ArrayList al = new ArrayList();
while(rs.next())
{
ArrayList rec = new ArrayList();

for(int i=0; i<2; i++)
{
Object val = rs.getObject(i);
rec.add(val);
}
rs.close();
st.close();
}
catch...
```
mein table sieht so aus:

  a    |    b
 :           :
117   | 268.5
117   | 278.5
117   | 300.5
118   | 271
118   | 272.5
118   | 292
119   | 274.5
119   | 276
119   | 286.5
119   | 306.5
120   | 275
120   | 276.5
120   | 296
  :         :

was ich gerne machen moechte ist zB fuer a = 120: 296-276.5, 276.6-275 und das fuer alle a

wenn ich aber meine arraylist ausgebe bekomme ich nur ganze row's in der form [120,296].

wie kann ich solch eine subtraktion ueber das ganze resultset hinbekommen? muss ich da eventuell einen zusaetzlichen index (auto increment) in die tabelle einfuegen? oder klappt das auch mit java?

kann mir da jemand weiterhelfen?

danke!
k.


----------



## Murray (26. Apr 2006)

Die drei b's für a =120 stehen ja in drei verschiedenen Rows des ResultSets, daher fehlt ein next. Wenn Du Dir ganz sicher sein kannst, dass immer drei Zeilen mit dem gleichen a kommen, dann könnte es wohl so gehen:

```
ArrayList recs = new ArrayList(); //--- Liste von Listen
while(rs.next()) {
  ArrayList rec = new ArrayList(); //--- diese Liste enthält 3 b's zu einem a

  for(int i=0; i<2; i++) {
    if (  i > 0) rs.next(); //--- für i=0 wurde das next() bereits in der while-Bedingung gemacht
    Object val = rs.getObject(1); //--- getObject(0) liefert a, getObject(1) das in dieser Zeile zugeh. b
    rec.add(val);
 }
 recs.add( rec);
}
```

Sicherer wäre es wohl, nur eine Schleife zu haben und sich das letzte a zu merken. Wenn man auf ein anderes a trifft als beim letzten Durchlauf, dann muss man eine neue Zeile anfangen.


----------



## Kawa-Mike (26. Apr 2006)

nimm das if(i>0)rs.next() ganz aus der for Schleife heraus. Du brauchste es doch nur einmal für jede Zeile im Resultset auszuführen. Dann ist das if auch überflüssig.
also:
 . . .
rs.next()
for( . . .)


----------



## Murray (26. Apr 2006)

Kawa-Mike hat gesagt.:
			
		

> nimm das if(i>0)rs.next() ganz aus der for Schleife heraus. Du brauchste es doch nur einmal für jede Zeile im Resultset auszuführen.


Die Aussage verstehe ich nicht: das Problem besteht doch genau darin, dass das ResultSet n-mal drei Zeilen enthält, aus denen dann n Dreiergruppen gebilden werden sollen, oder nicht?


----------



## Kawa-Mike (27. Apr 2006)

Normalerweise weisst du nicht wieviele Zeilen das Resultset hat, es hängt von der Anzahl treffen ab, die die WHERE bedingung liefert. Also prüfst du mit 
 while(rs.next())
ob es noch einen Datensatz ( Zeile ) gibt. rs.next() holt die nächste Zeile und gibt TRUE zurück wenn es erfolgreich war.

In jeder Zeile gibt es - in deinem Beispiel - genau zwei Spalten, nämlich a und b.
Die liest du dann mit der for-Schleife aus, die ganau zweimal durchlaufen wird.

Es gibt ein sehr gutes Buch von Guido Krüger
http://www.javabuch.de/

Es steht als HTML-Ausgabe zum freien Download im Web. Dort gibt es ein Kapitel über Datenbankzugriffe mit JDBC mit guten Beispielen.
Gruss
Mike


----------



## Murray (27. Apr 2006)

Wie man ein ResultSet iteriert, ist ja klar. Für mich sieht aber so aus, als wollte Kubi direkt bei der Iteration des ResultSets das Ergebnis in eine andere Struktur überführen:

Aus dem Ergebnis
#1:  a1,b11
#2:  a1,b12
#3:  a1,b13
#4:  a2,b21
#5:  a2,b22
#6:  a2,b23
   ...
#((n-1)*3+1):   an,bn1
#((n-1)*3+2):   an,bn2
#((n-1)*3+3):   an,bn3

soll so eine Liste werden:
 {{b11,b12,b13},{b21,b22,b23},...,{bn1,bn2,bn3}}

Es sollen also jeweils die b's aus 3 Zeilen zu einem Ergebnissatz zusammengefasst werden; die a's dienen nur der Sortierung und spielen für die Ergebnisliste keine Rolle.

War das so gemeint?


----------



## Kawa-Mike (27. Apr 2006)

Danke für den Tip Murray,
ich habe wirklich nicht genau verstanden was er wollte.

Evtl. kann man das Problem mit einer Hashtable lösen.
a  ist der Key, die Objekte sind ArrayListen.
Man püft, ob der Key schon vohanden ist
( h.containsKey() ),
falls nicht - füge einen neuen Eintrag zu Hashtable hinzu,
falls ja - hole die ArrayList und hänge ein B and die ArrayList an.

Gruss
Mike


----------



## kubi (27. Apr 2006)

hi leute!

danke fuer eure hilfe.

ich hab mein result set mal mit und mal ohne die if anweisung ausgeben lassen (print innerhalb der for schleife).

ohne die if einweisung schluckt er einige meiner daten des resultset. mit if funktioniert es ohne probleme. 

danke nochmal!


----------



## kubi (27. Apr 2006)

hi murray!

so wie du das beschreiben hast, hab ich mir das gedacht.

also

a1    b11
a1    b12
a1    b13
a2    b21
a2    b22
a2    b23
:        :

ich hab mich mal an den gestrigen beitrag rangemacht. 

wenn ich mein table zuvor mit einer spl query sortiere, koennte ich dann auch deine loesung von gestern benutzen, oder ist es doch besser mike's tip mit dem hashtable zu folgen. 

danke!


----------



## Murray (27. Apr 2006)

Wenn ich den ersten Post richtig verstanden habe, dann willst Du mit den drei b's ja noch rechnen (vom größten die kleineren abziehen, oder?). Wenn das so ist, dann brauchst Du ja ohnehin eine Sortierung aller b's für ein a. In diesem Fall würde ich bei der von Dir ja schon angegebenen zweistufigen Sortierung bleiben. 
Ansonsten ist der Hashtable-Ansatz vielleicht etwas übersichtlicher.


----------



## kubi (27. Apr 2006)

ok.

ich werds mit den hashtable auch mal versuchen. 

danke!

gruesse.
k.


----------



## Kawa-Mike (27. Apr 2006)

Hi Kubi,
wenn es Dir nur auf die Werte ( Ergebnisse ) ankommt, dann  brauchst du keine Hashtable. Es reicht ein normales Double-Array.
Du kannst mit rs.getDouble("b") die Werte direkt als double aus dem Resultset auslesen und dann damit Rechnen.


----------

