Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Java Key object in hashmap

Pagina: 1
Acties:

  • matty___
  • Registratie: Augustus 2005
  • Laatst online: 12-11 14:03
Hallo,

ik loop tegen het probleem aan dat ik een hasmap gebruik en als key een object wil gebruiken waarin ik een 2 delige key als properties heb opgeslagen.

keyObject-careUnit = "CareUnit ASB"
keyObject-node = "Node 1";

hashmap.put(keyObject, value);

Dit werkt allemaal prima.


Later in mijn code bouw ik een new keyObject op met dezelfde careUnit en node. Vervolgens probeer ik met
hashmap.get(keyObject) weer dezelfde value op te halen.
Dit lukt niet omdat java natuurlijk niet naar de inhoud van de keyObject kijkt maar naar de object hash.

Wat is nu een handige/nette manier om hierom heen te bouwen?
- hash zelf maar van een waarde voorzien?
- de 2 keys (strings) concaten en deze string als key gebruiken?

De reden waarom ik een object als key gebruik is omdat ik zo makkelijke extra velden kan toevoegen als dat later nodig mocht zijn.

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-11 01:19

Nick_S

++?????++ Out of Cheese Error

Om dit inderdaad te laten werken, zul je de equals en de hashcode moeten implementen.

Hiervoor zou je kunnen kijken naar de HashCodeBuilder en de EqualsBuilder van Apache Commons-lang.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Verwijderd

Het heet niet voor niets een hashmap :P

  • matty___
  • Registratie: Augustus 2005
  • Laatst online: 12-11 14:03
Verwijderd schreef op vrijdag 09 november 2012 @ 16:01:
Het heet niet voor niets een hashmap :P
dat dan weer wel. :P

  • matty___
  • Registratie: Augustus 2005
  • Laatst online: 12-11 14:03
Nick_S schreef op vrijdag 09 november 2012 @ 15:56:
Om dit inderdaad te laten werken, zul je de equals en de hashcode moeten implementen.

Hiervoor zou je kunnen kijken naar de HashCodeBuilder en de EqualsBuilder van Apache Commons-lang.
ga ik dat bekijken. thx

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-11 01:19

Nick_S

++?????++ Out of Cheese Error

Verwijderd schreef op vrijdag 09 november 2012 @ 16:01:
Het heet niet voor niets een hashmap :P
Omdat die met equals werkt? ;)

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

Nick_S schreef op vrijdag 09 november 2012 @ 16:03:
[...]

Omdat die met equals werkt? ;)
Als de hash van twee gelijke keys verschilt kom je ook niet ver. :P

De hash is trouwens slechts een voorselectie, om het alvast te laten werken mag die gewoon een simpele waarde zijn (return 0;). Het werkt dan alleen niet efficiënt.

Heeft geen speciale krachten en is daar erg boos over.


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-11 01:19

Nick_S

++?????++ Out of Cheese Error

Als de hash van 2 gelijke keys verschilt, dan heb je je niet aan het equals contract gehouden. ;)
bwerg schreef op vrijdag 09 november 2012 @ 16:20:
[...]

Als de hash van twee gelijke keys verschilt kom je ook niet ver. :P

De hash is trouwens slechts een voorselectie, om het alvast te laten werken mag die gewoon een simpele waarde zijn (return 0;). Het werkt dan alleen niet efficiënt.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

Ja, en het werkt dus niet omdat het dus niet alleen met equals werkt, maar ook met hashCode. :)

Strict genomen heb je natuurlijk gelijk dat een implementatie van equals ook een implementatie van hashCode vereist, maar het wordt ook nog wel eens los gebruikt.

[ Voor 59% gewijzigd door bwerg op 09-11-2012 16:24 ]

Heeft geen speciale krachten en is daar erg boos over.


  • matty___
  • Registratie: Augustus 2005
  • Laatst online: 12-11 14:03
voor de hash heb ik:
code:
1
2
3
4
@Override
public int hashCode() {
return new HashCodeBuilder(21, 11).append(this.getCareUnit()).append(this.getNode()).toHashCode();
            }

voor de equals heb ik
code:
1
2
3
4
5
...
KeyClass other = (KeyClass) obj;
if (this.getCareUnit().equals(other.getCareUnit()) && this.getNode().equals(other.getNode()))
    return true;
...

eraan toegevoegd en dat werkt als een zonnetje :)

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-11 01:19

Nick_S

++?????++ Out of Cheese Error

matty___ schreef op vrijdag 09 november 2012 @ 16:24:
voor de hash heb ik:
code:
1
2
3
4
@Override
public int hashCode() {
return new HashCodeBuilder(21, 11).append(this.getCareUnit()).append(this.getNode()).toHashCode();
            }

voor de equals heb ik
code:
1
2
3
4
5
...
KeyClass other = (KeyClass) obj;
if (this.getCareUnit().equals(other.getCareUnit()) && this.getNode().equals(other.getNode()))
    return true;
...

eraan toegevoegd en dat werkt als een zonnetje :)
Maak voor de zekerheid ook je Key object immutable, anders kun je alsnog je objecten kwijt raken.

code:
1
2
3
map.put(key, "value");
key.setCareUnit("ietsAnders");
map.get(key);


Dit gaat ook niet werken.

Zorg dus dat je Key immutable is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public final class Key {

  private final String careUnit;
  private final String node;

  public Key(final String careUnit, final String node) {
    this.careUnit = careUnit;
    this.node = node;
  }

  public String getCareUnit() {
    return careUnit;
  }

  public String getNode() {
    return node;
  }

  // Equals en hascode...
}

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • matty___
  • Registratie: Augustus 2005
  • Laatst online: 12-11 14:03
thx voor de tip.

Waarom ook final meegeven bij de constructor. Is het niet voldoende de priv property final te maken?

[ Voor 77% gewijzigd door matty___ op 09-11-2012 16:35 ]


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
matty___ schreef op vrijdag 09 november 2012 @ 16:34:
thx voor de tip.

Waarom ook final meegeven bij de constructor. Is het niet voldoende de priv property final te maken?
final voor parameters is op zich een goede gewoonte (je wilt niet perongeluk iets assignen aan een parameter), maar heeft inderdaad niks met je probleem te maken.

"Any sufficiently advanced technology is indistinguishable from magic."


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een IDE als Netbeans of Eclipse heeft trouwens gewoon ingebouwde functionaliteit om zo'n hashcode en equals te maken, heb je ook geen overhead van die Builder @Runtime. (Eclipse: onder source, Netbeans: onder alt-insert). ;)
Herko_ter_Horst schreef op vrijdag 09 november 2012 @ 18:55:
[...]

final voor parameters is op zich een goede gewoonte (je wilt niet perongeluk iets assignen aan een parameter), maar heeft inderdaad niks met je probleem te maken.
Dit soort constructors laat je ook gewoon door je IDE maken, en dan krijgen ze voor de leesbaarheid geen overbodige final mee. ;)

[ Voor 48% gewijzigd door pedorus op 09-11-2012 19:26 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1