15. maj 2006 - 20:43Der er
24 kommentarer og 1 løsning
Indhold i objekter ens - ens hashcode
Okay - det er først gang jeg bevæger mig udi noget med hashcoder, og selvfølgelig kan jeg ikke få det til, at fungere som jeg ønsker det.
Jeg har en hashtable hvori jeg gemmer objekter, af en type som jeg selv har specificeret. Hvert objekt indeholder et 3*3 bytearray. På hver plads i bytearrayet står der enten 0,1 eller 2. Jeg ønsker det sådan, at objekter med ens bytearrays har samme hashcode - da jeg benytter hashcoden (int pakket i Integer objekt) til key i min hashtable. Dvs. adder jeg et objekt til min hashtable, hvor der i forvejen findes et objekt indeholdene samme bytearray - så bliver dette overskrevet.
Indtil nu har min hashcode udregning været at gange indholdet af en plads i bytearrayet med et primtal og ligge alle resultaterne sammen - desværre er det nok ikke unikt. Nogen gode forslag til, hvordan jeg får lavet en unik hashcode som samtidig er ens hvis bytearray'sne er ens?
Okay jeg har også overskrevet equals methoden - den ser sådan her ud:
if (board.getClass() == Board.class) { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { if (((Board)board).checkPos(x,y) != pos[x][y]) return false; } } return true;
} else return false;
Måske er problemet, at mine primtal ikke ligger langt fra hinanden.
Til arne_v: Selvfølgelig kan jeg bruge hashcoden som key i min hashtable. Og hashcoden skal som sådan heller ikke være unik, objekter med ens bytearrays skal have samme hashcode. Objektet bliver jo gemt sammen med keyen. Jeg forstår måske ikke rigtigt hvor du vil hen.
Ja jeg bruger ht.add(o.hashcode(), o); men ok, så forstår jeg ikke hvorfor det ikke er godt. Jeg vil jo gerne have at hvis et objekt med den hashcode allerede findes, så overskrives den.
Arne_v - du er meget klog mand :-) Men du må lige ned på et lavere niveau hvis jeg skal forstå hvad det er jeg gør forkert. Jeg ved ikke en gang hvad reversibel betyder.
1) lave en klasse med kun de 9 bytes, din nuvaerende hashcode og equals 2) lave en klasse med klasse #1 osm field og alle de andre felter i de nuvaerende klasse
Okay - så det første jeg skal gøre er at lade være med, at bruge hashcoden som key right? Jeg laver derfor i stedet en key metode i mit objekt og bruger den. Og hvis jeg så bruger et intarray i stedet for et byte, så kan jeg bruge min keyudregning eller hvordan? Og tak for de meget hurtige svar :-)
Jeg er blevet helt forvirret nu - jeg har ingen idé om hvordan jeg skal implementere det, så det bliver rigtigt :-) Den eneste jeg kunne ønske mig var at lave en key, der kunne bruges sådan at gamle objekter i min hashtable blev overskrevet hvis et nyt med samme array tilføjes.
Jeg har lavet det om efter arne_v's opskrift. Jeg har lavet et Key objekt som oprettes og returnes når getKey() kaldes i Board. Tak for hjælpen - lig et svar, så er der point.
Jeps det virker helt perfekt - da jeg fik rettet det hele til. Mine board objekter (som jeg gemmer i hashtablen) har metoden: public Key getKey() { return new Key(pos); }
Og så har jeg flyttet equals og hashcode overskrivningerne over i key objektet. Så jeg gemmer bare med ht.add(board.getKey(), board)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.