problem mit resultset->arraylist

Status
Nicht offen für weitere Antworten.

kubi

Mitglied
hoi!

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

code:

....
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.
 
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:
Code:
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.
 
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( . . .)
 
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?
 
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
 
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?
 
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
 
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!
 
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!
 
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.
 
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben