2012-07-26 1 views
8

Come descritto nella risposta allo Double in HashMap, Doubles non deve essere utilizzato in HashMaps perché sono difficili da confrontare per l'uguaglianza. Credo che il mio caso sia diverso, ma ho pensato di chiedere di essere sicuro visto che non ho visto nulla al riguardo.Devo usare Double come chiavi in ​​una TreeMap?

Avrò una serie di doppi valori associati agli oggetti, e voglio che vengano ordinati per i doppi valori. TreeMap è una soluzione appropriata? Ci sarebbe uno migliore? I valori double vengono generati un sacco di matematica, quindi la probabilità di un valore duplicato è estremamente bassa.

EDIT: Vorrei chiarire: tutto ciò di cui ho bisogno è avere questo elenco di oggetti ordinati per i doppi a cui sono associati. I valori dei doppi saranno scartati e non sarò mai chiamano map.get(key)

+0

Sembra che tu debba essere al sicuro. Si potrebbe aggiungere un po 'di gestione del fattore fudge per evitare che si verifichino duplicati solo nel caso in cui lo facciano. – Wug

risposta

13

Doubles non deve essere utilizzato in HashMaps perché sono difficili da confrontare per l'uguaglianza.

  • Pensa mai di cercare di get i valori sulla base di alcuni tasti?

    • Se si, allora il ragionamento sulla "difficile da confrontare" si applica e, probabilmente, si dovrebbe evitare di tale struttura di dati (o sempre contare su tailMap/headMap/submap a prendere gamme di mappa).

    • Se non (cioè sarete in genere solo fare for (Double key : map.keySet()) ... o iterare il entrySet) allora direi che stai bene con Double come chiavi.

I valori doppi si generano una serie di matematica, quindi la probabilità di un valore duplicato è estremamente bassa.

  • si tratta di un bug se effettivamente fare ottenere un duplicato?

    • Se allora non è la struttura dei dati diritto di utilizzare. Ad esempio, potresti utilizzare Multimap da Guava.

    • Se non, (vale a dire non importa quale dei due valori si associa a, perché possono differire solo da una piccola Epsilon in ogni caso), allora si dovrebbe andare bene.

+0

Questo è perfetto. Entrambe le mie risposte sono "no", quindi sono a posto. – MalcolmOcean

1

Il problema con i doppi di mappe ad albero è esattamente la stessa in quanto è con raddoppia nella cartina hash - confronto per l'uguaglianza.Se si evitano chiamate di treeMap.get(myDouble) e si rimane invece con le query di intervallo (ad esempio utilizzando submap), si dovrebbe andare bene.

TreeMap<Double,String> tm = new TreeMap<Double,String>(); 
tm.put(1.203, "quick"); 
tm.put(1.231, "brown"); 
tm.put(1.233, "fox"); 
tm.put(1.213, "jumps"); 
tm.put(1.243, "over"); 
tm.put(1.2301, "the"); 
tm.put(1.2203, "lazy"); 
tm.put(1.2003, "dog"); 
for (Map.Entry<Double,String> e : tm.subMap(1.230, 1.232).entrySet()) { 
    System.out.println(e); 
} 

Questo stampa

1.2301=the 
1.231=brown 

Vedi questo frammento su ideone.

0

Se si desidera solo li ordinate, ci sono le collezioni migliori (ad esempio SortedSet). È inoltre possibile utilizzare qualsiasi elenco e utilizzare le utilità per l'ordinamento (penso che siano in java.util.Collection).

utilizzare mappe e tabelle Solo quando si desidera accedere direttamente una voce dalla sua chiave.

1

Se si desidera solo per ordinare loro, la cosa migliore sarebbe quella di creare un oggetto wrapper per il doppio e l'oggetto, implementare l'interfaccia "comparabile" su questo involucro, e utilizzare una collezione semplice per ordinare loro