|
|
|
|
Strumenti |
22-03-2010, 15:13 | #1 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
[JAVA] hashset, strano comportamento
Salve a tutti
poniamo che io abbia la classe Concetto, sulla quale ho ridefinito il metodo hashcode(). Purtroppo l'ho ridefinito male ed ho un sacco di collisioni, ma per adesso non posso farci nulla. Poniamo anche che io abbia un metodo trovaVicini() che mi restituisce un HashSet<Concetto> e su tale set eseguo una iterazione (nota: l'ordine di visita è importante). Poniamo anche che in tutto questo io stia utilizzando una libreria X. Se lancio 10 volte il programma, ottengo 10 volte esattamente lo stesso risultato, quindi trovaVicini mi ha dato sempre lo stesso ordine. Ad un certo punto cambio la libreria X per la libreria Y. Nonostante ne X ne Y siano correlate ai Set o a Concetto, per qualche motivo che non mi spiego, noto che trovaVicini mi restituisce l'HashSet in ordine diverso rispetto al solito. Infatti se lancio 10 volte il programma, ottengo 10 volte esattamente lo stesso risultato, quindi trovaVicini mi ha dato sempre lo stesso ordine, solo che non è più quello di prima. Non riesco a capire se è normale e soprattutto perchè ha aspettato che cambiassi libreria per decidere di cambiare ordine. Se qualcuno ha qualche suggerimento è ben accetto, mi rendo conto di non essere stato molto preciso ma non so neanche io come spiegarlo. Non posso postare il codice perchè richiederebbe di postare mezzo progetto o giù di li... Thx in advance.
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
22-03-2010, 15:42 | #2 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12580
|
Per l'HashSet non è garantito l'ordine.
Forse viene modificato quando le classi vengono ricompilate, ma su questo non saprei dirti. So per certo che non garantisce l'ordine per cui se hai bisogno che sia garantito usa un'altra Collection. |
22-03-2010, 16:12 | #3 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22459
|
ad esempio treeset, che implementa la stessa interfaccia di set ma garantisce l'ordine
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
22-03-2010, 17:06 | #4 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
ok, diciamo che il fatto che cambi l'ordine allo stato attuale delle cose non mi cambia granchè, però volevo essere certo del fatto che potesse essere colpa dell'hashset e soprattutto ero curioso di capirne le motivazioni.
Siccome il metodo trovaVicini si trova in una libreria, in teoria non potrei toccarlo, anche se in pratica si perchè ho i sorgenti. Potrei fare una zozzata e prendere l'hashset in uscita e schiaffarlo in un treeset+comparator da passare al resto del codice, spero solo che non mi picchi a livello prestazionale, visto che già così sono al limite . thx
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
22-03-2010, 17:13 | #5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Non vorrei aver detto una fesseria, magari attendi conferme, smentite o alternative in merito da altri utenti.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
23-03-2010, 09:58 | #6 | |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
Quote:
Mi rimane la curiosità di capire come mai l'hashset ha deciso di restituirmi i risultati in ordine diverso così, a muzzo, visto che non ho cambiato ne dati ne funzione di hash...
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
|
24-03-2010, 09:01 | #7 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
||
24-03-2010, 10:47 | #8 |
Member
Iscritto dal: Oct 2002
Messaggi: 133
|
Hashmap, posiziona gli elementi in base al loro hash e alla grandezza della tabella stessa.
Probabilmente le librerie che usi inizializzano il set a dimensioni diverse. Saluto |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:36.