Toon posts:

[JAVA] hashtable / Arraylist

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met het schrijven van een queryhandler-klasse in JAVA.

Ik heb een methode selectQuery(query) die aan de resultset de velden opvraagd die teruggegeven worden. Ik wil namelijk dat deze functie een hashtable teruggeeft met als keys de veldnamen van de select-query.
Ik heb de volgende code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// voert de databasevraag uit
  protected void selectQuery(String query)
  {
    // afvangen die fouten!
    try
    {
      ResultSet res = this.stmt.executeQuery(query);
      // metainformatie ophalen
      ResultSetMetaData rmd = res.getMetaData();
      // aantal geretourneerde velden vastleggen
      this.aantalVelden = rmd.getColumnCount();
      this.affectedRows = 0;
      while (res.next())
      {
        for (int teller = 0; teller < this.aantalVelden; teller++)
        {
          // waarde van het veld
          String waarde       = res.getObject(teller + 1).toString();
          String kolomNaam = rmd.getColumnName(teller + 1);
          
          // aargh, begin nietmeerbegrijpmodus
          // waarde toevoegen aan Hashtable (Associatieve array)
          this.result[teller].put(kolomNaam, waarde);
          // einde nietmeerbegrijpmodus
        }
        this.affectedRows++;
      }
      System.out.println("aantal: "+this.affectedRows);
    }
    catch (SQLException E)
    {
      System.out.println("SQLException: " + E.getMessage());
      System.out.println("SQLState:     " + E.getSQLState());
      System.out.println("VendorError:  " + E.getErrorCode());
    }
}


Mijn oorspronkelijke idee was om de hashtable te vullen met arraylists.
Stel dat ik dus een: select id, naam from blaat doe dan wil ik het dus op de volgende manier terug:

result["id"][0] = "1"
result["id"][1] = "2"
etc.

result["naam"][0] = "Jan"
result["naam"][1] = "Piet"
etc.

Het probleem is alleen dat de hashtable in 1 keer gevuld wil worden met een arraylist en ik heb op dat moment de volledige arraylist nog niet. Ik heb al allerlei dingen geprobeerd, maar zit nu toch echt vast. Het moet wel kunnen lijkt mij, want ik heb precies hetzelfde al eens geschreven in PHP....

Ik hoop dat ik wat nuttige feedback krijg, want ik ben helemaal flauw van dat verschrikkelijke type-gezeik.... (ff frustraties kwijt raken)

[ Voor 5% gewijzigd door Glimi op 05-05-2003 18:13 ]


Verwijderd

erg omslachtig, efficienter is het om precies omgekeerd te doen: een arraylist met alle rows terug te geven en elke element van die array bevat een hashtable met fields vs. inhoud

deze methode moet je per veld checken of die hash al een key heeft voor dat veld, zo niet de array creeeren en als wel array op halen. veldje toevoegen aan array en teruggooien in die hash (gebruik trouwens iets uit collections, hashmap of zo, sneller dan hashtable)

oftewel waar je nu je niet begrijp modus hebt:

if (hash contains key) { array = get array from hash } else { new array }. waarde toevoegen array en weer terug de hash in so to speak :)

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
yow:

nog better: een HashMap met ColumnName -> ColumnIndex (dus 1 maal)
en dan gewoon een vette [][];
dan:

Object get(String aColumnName, int aRow)
{
return mObjects[aRow,(Integer)get(aColumnName).intValue()];
}

Verwijderd

dan kan je nog beter gewoon een object[rows][cols] teruggooien :) vanuitgaande dat de method die de query doet ook weet welke velden waar staan. ben toch meestal lui door een resultset terug te geven, in de db class connection + statement in hashmap met als key resultset, calling method data uit resultset laten plukken en daarna de hele handel closen

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 05 mei 2003 @ 20:15:
erg omslachtig, efficienter is het om precies omgekeerd te doen: een arraylist met alle rows terug te geven en elke element van die array bevat een hashtable met fields vs. inhoud
dat is juist niet efficienter. Bedenk dat een ArrayList, wat in principe gewoon een array is, lichter is dan een Hashtable. Ook de opzoektijd in een ArrayList is sneller dan in een Hashtable.

Als je alle elementen wilt itereren is het dus handiger dat je de langzamere opzoektijd minder vaak voor laat komen dan de snellere. Je moet dan dus eerst de juiste colom opzoeken, en daarna alle rijen enumereren.

En wat geheugengebruik betreft precies hetzelfde: 1 ArrayList met 100 Hashtables is meer dan 1 Hashtable met 100 ArrayLists

Nou zal dit allemaal in de praktijk niet zoveel uitmaken, maar het is niet juist om te zeggen dat jouw methode efficienter is ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Nou zal dit allemaal in de praktijk niet zoveel uitmaken, maar het is niet juist om te zeggen dat jouw methode efficienter is
hmmm, heb je inderdaad gelijk in; verschil tussen arraylist en hashtable/map niet meegenomen :)
Pagina: 1