[JAVA] JDBC, GUI, HashMap

Pagina: 1
Acties:

  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 08:13
Ik heb een GUI met een JList waarin ik op dit moment gebruikersnamen (voornaam, evt tussenvoegsel, achternaam) neerzet door middel van een JDBC koppeling en SQL. Het is ook de bedoeling dat ik die gebruikers kan wijzigen en verwijderen. Het probleem is dat gebruikersnamen ook dubbel kunnen zijn .(meerdere Jan Jansens ;) ) Ik dacht dus: dan pak ik een HashMap om daarin als key het sofinr te zetten en als waarde de naam.

Als ik een gebruiker wil wijzigen staat in de JList de voornaam, (tussenvoegsel), achternaam. Hoe krijg ik het voor elkaar om van een gebruiker uit de JList weer het sofinr dat in de HashMap staat terug te krijgen? Hier is het probleem bij dat in de JList meerdere dezelfde waardes kunnen staan...

  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 08:13
Misschien ter overige informatie:

De sofinrs die ik in de hashmap wil zetten zijn uniek. Want de key moet tog uniek zijn in een hashmap?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 22-02 18:04

momania

iPhone 30! Bam!

Rvanlaak schreef op maandag 24 april 2006 @ 11:22:
De sofinrs die ik in de hashmap wil zetten zijn uniek. Want de key moet tog uniek zijn in een hashmap?
De hashCode() method van de objecten die je als key gebruikt uniek zijn.

Verder moet je denk ik zelf je model maken voor je list, zodat je daarin gewoon de gehele gebruiker kwijt kan ipv alleen maar een representatieve String :)

Neem je whisky mee, is het te weinig... *zucht*


  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 08:13
Eerst stonden in de JList ook de sofinrs, maar we vonden dit niet representatief. Als je namelijk de sofinrs zou hebben zou er nu geen probleem zijn, maar op deze manier is het zoeken, wijzigen en verwijderen wel gebruiksvriendelijker.

Zou de oplossing dus zijn om in de JList toch de sofinrs toe te voegen, of is er een andere manier?
Betekent deze oplossing dan dus ook dat ik geen HashMap meer nodig heb omdat een String[] genoeg is.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
Rvanlaak schreef op maandag 24 april 2006 @ 11:38:
Zou de oplossing dus zijn om in de JList toch de sofinrs toe te voegen, of is er een andere manier?
Betekent deze oplossing dan dus ook dat ik geen HashMap meer nodig heb omdat een String[] genoeg is.
De index van een item in de JList is natuurlijk wel uniek. Zorg er dus voor dat je voor elke index weet wat het sofinr is.

Maak zoals momania zegt een eigen ListModel, daar kan je dat mooi in kwijt. Niet alleen kan je bijhouden op welke index welk sofinr staat, maar het mooiste is natuurlijk als je een lijst hebt met referenties naar Persoon objecten waarin naast sofinr, naam alle andere gegevens staan die je van een persoon nodig hebt.

Je moet dus helemaal geen (Hash)Map gebruiken in deze situatie.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22-02 18:32
Als ik jou was, zou ik een ListModel gebruiken waar je (zoals momania zegt) gebruiker-objecten in zet. Hoe je JList die gebruikers laat zien kan je volledig zelf bepalen.

Roomba E5 te koop


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
momania schreef op maandag 24 april 2006 @ 11:27:
[...]
De hashCode() method van de objecten die je als key gebruikt uniek zijn.
Dat is helemaal geen vereiste hoor, je kan prima een HashMap hebben met daarin verschillende objecten (als in equals()) die allemaal dezelfde hashcode hebben. Het is welzo dat voor de performance van een hashmap het bevorderlijk is wanneer verschillende objecten verchillende hashcodes hebben, maar de uiteindelijke gelijkheid wordt door equals() bepaald.

  • Kwistnix
  • Registratie: Juni 2001
  • Nu online
Leef je uit en schrijf een eigen implementatie van ListModel voor jouw specifieke eisen.


Edit:

Nu ga ik een cursus "lees het topic door voodat je post" volgen. *zwaai*

[ Voor 34% gewijzigd door Kwistnix op 24-04-2006 12:11 ]


  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 08:13
  1. Het nadeel van de hashmap is dan toch dat ik hiermee niet de mogelijkheid heb om er meerdere "Jan Jansens" in te zetten? En dan van een van die Jans het sofinr terug te krijgen.
    De JList houdt toch niet van zijn eigen inhoud ook de sofinrs bij in mijn geval?
  2. Kun je bij een ListModel ook alleen de voornaam, (tussenvoegsel), achternaam tonen in de JList, en dan van diezelfde waarde er weer het sofinr uithalen? Dit zou dan namelijk mijn oplossing zijn omdat ik met dat sofinr weer in de database in een ander frame diezelfde klant moet kunnen wijzigen.

  • coenbijlsma
  • Registratie: Augustus 2004
  • Niet online
Volgens mij kun je toch ook gewoon een object in een JList stoppen? Dan kun je de pointer weer opzoeken in de HashMap, alleen moet je er dan wel telkens helemaal doorheen...

  • momania
  • Registratie: Mei 2000
  • Laatst online: 22-02 18:04

momania

iPhone 30! Bam!

Rvanlaak schreef op maandag 24 april 2006 @ 12:11:
  1. Het nadeel van de hashmap is dan toch dat ik hiermee niet de mogelijkheid heb om er meerdere "Jan Jansens" in te zetten? En dan van een van die Jans het sofinr terug te krijgen.
    De JList houdt toch niet van zijn eigen inhoud ook de sofinrs bij in mijn geval?
  2. Kun je bij een ListModel ook alleen de voornaam, (tussenvoegsel), achternaam tonen in de JList, en dan van diezelfde waarde er weer het sofinr uithalen? Dit zou dan namelijk mijn oplossing zijn omdat ik met dat sofinr weer in de database in een ander frame diezelfde klant moet kunnen wijzigen.
Kijk eens naar de javadocs van JList: http://java.sun.com/j2se/...pi/javax/swing/JList.html

Daar staan goede voorbeelden in, voor wat jij wilt. Je kan in je model dan gewoon je persoon objecten kwijt en met een ListCellRenderer imlpementatie zelf bepalen wat je van die persoon wilt laten zien in je GUI. In je model blijft het dan gewoon je volledige persoon object en hoef je dus ook niets meer moeilijk op te gaan zoeken :)

Neem je whisky mee, is het te weinig... *zucht*


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 22-02 17:25

Robtimus

me Robtimus no like you

Waarom een eigen ListModel schrijven? ListModel ondersteunt Objects - de toString method wordt gebruikt voor het afbeelden in de GUI. Gebruik gewoon DefaultListModel en je bent klaar.
In je JList zet je dus je personen zelf, waarbij toString alleen de naam returned.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Ik heb ongeveer hetzelfde ook al is moeten programmeren. Maak het jezelf echt niet moeilijk, gewoon objecten in die JList knallen. Ik geloof dat je gewoon moet zorgen dat ze serializable zijn.
Het is al een tijdje geleden, maar als het echt nodig is, zoek ik het wel even op hoe ik het juist gedaan heb. Mail me dan even.
Het zou trouwens maar erg zijn als iederen die iets in een JList wilt zetten die aanklikbaar is, die hele zever met die hashmaps moet gaan doen. Je moet dan toch altijd aan het object aankunnen?!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

IceManX schreef op maandag 24 april 2006 @ 12:29:
Waarom een eigen ListModel schrijven? ListModel ondersteunt Objects - de toString method wordt gebruikt voor het afbeelden in de GUI.
Maar het is niet echt netjes om de toString() te overriden omdat die toevallig in een GUI wordt afgebeeld. De toString() moet een zinvolle representatie van het object zijn en IMHO is alleen het sofinr. dat in dit geval niet.

Wie trösten wir uns, die Mörder aller Mörder?


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 22-02 17:25

Robtimus

me Robtimus no like you

Nee, maar in de JList moeten voornaam, evt tussenvoegsel en achternaam staan. Voor een object "Persoon" vind ik dat nog wel redelijk representatief ;)

Maar een nieuwe cell renderer is idd beter.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

matthijsln schreef op maandag 24 april 2006 @ 11:57:
[...]


Dat is helemaal geen vereiste hoor, je kan prima een HashMap hebben met daarin verschillende objecten (als in equals()) die allemaal dezelfde hashcode hebben. Het is welzo dat voor de performance van een hashmap het bevorderlijk is wanneer verschillende objecten verchillende hashcodes hebben, maar de uiteindelijke gelijkheid wordt door equals() bepaald.
Even als aanvulling :) De HashMap werkt grofweg hetzelfde als een HashTable, op synchronisatie en null waarden na, maar dat terzijde. Dit komt er op neer dat de HashMap met zogenaamde emmers werkt, die iirc bepaald worden adhv de hashCode van een Object (die je dus kan overriden). Anders gezegd, emmers specifiek voor een bepaalde hashCode. Wanneer je dus twee objecten hebt met dezelfde hashcode, en er dus een hashcollission optreedt, dan komen deze in dezelfde emmer terecht. Het gevolg is nu dat je een lineaire zoektijd hebt voor die emmer voor die objecten. Dat wordt dus verstaan onder nadelig voor de zoektijd.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-02 00:22

Janoz

Moderator Devschuur®

!litemod

imho zou een toString functie een duidelijke representatie van het object weer moeten geven. Voor mij betekent dat oa dat wanneer objecten niet gelijk aan elkaar zijn, ze ook niet hetzelfde resultaat uit hun toString laten komen. Dat is echter vooral persoonlijke voorkeur.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
prototype schreef op maandag 24 april 2006 @ 21:21:
[...]
Even als aanvulling :) De HashMap werkt grofweg hetzelfde als een HashTable, op synchronisatie en null waarden na, maar dat terzijde. Dit komt er op neer dat de HashMap met zogenaamde emmers werkt, die iirc bepaald worden adhv de hashCode van een Object (die je dus kan overriden). Anders gezegd, emmers specifiek voor een bepaalde hashCode. Wanneer je dus twee objecten hebt met dezelfde hashcode, en er dus een hashcollission optreedt, dan komen deze in dezelfde emmer terecht. Het gevolg is nu dat je een lineaire zoektijd hebt voor die emmer voor die objecten. Dat wordt dus verstaan onder nadelig voor de zoektijd.
Inderdaad werkt dat op zo'n soort manier. Btw, ik was nog vergeten te vermelden dat bij een HashMap dit opgaat voor de keys en niet voor de gekeyde objecten (anders heb je een HashSet).

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 22-02 17:25

Robtimus

me Robtimus no like you

Let er trouwens op dat, als je hash maps / sets gebruikt, de hashCode() waarde van de keys / waarden niet mag veranderen, anders kun je het object niet meer terugvinden. Het object blijft nml in de bucket met hashCode() == X zitten terwijl de hash code opeens Y is.

Gebruik dus immutable objecten zoals strings, of zorg er zelf voor dat de waarden niet veranderen.

TreeMap / TreeSet kent overigens hetzelfde probleem.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1