2012-07-26 7 views
8

Como se describe en la respuesta a Double in HashMap, Dobles no se debe utilizar en HashMaps porque son difíciles de comparar por igualdad. Creo que mi caso es diferente, pero pensé en preguntar para asegurarme ya que no vi nada sobre esto.¿Debo usar Double as keys en TreeMap?

Voy a tener una serie de valores dobles asociados con los objetos, y quiero que estén ordenados por los valores dobles. ¿TreeMap es una solución adecuada? ¿Habría uno mejor? Los valores dobles se generan un montón de matemáticas, por lo que la probabilidad de un valor duplicado es extremadamente baja.

EDITAR: Debería aclarar: todo lo que necesito es tener esta lista de objetos ordenados por los dobles a los que están asociados. Los valores de los dobles serán descartados y nunca van a llamar map.get(key)

+0

Parece que deberías estar a salvo. Puede agregar un poco de manejo de factor de dulce para evitar que ocurran duplicados en caso de que lo hagan. – Wug

Respuesta

13

de dobles no debe usarse en HashMaps porque son difíciles de comparar la igualdad.

  • ¿Alguna vez tratar de get los valores sobre la base de ciertas teclas?

    • Si , entonces el razonamiento acerca de "difícil comparar" se aplica y es probable que debe evitar dicha estructura de datos (o confiar siempre en tailMap/headMap/submap a buscar rangos del mapa).

    • Si sin (es decir, por lo general va simplemente hacer for (Double key : map.keySet()) ... o iterar sobre la entrySet) entonces yo diría que está muy bien usar Double como claves.

Los valores dobles se generan un manojo de matemáticas, por lo que la probabilidad de que un valor duplicado es extremadamente bajo.

  • ¿Es un error si realmente haces obtener un duplicado ?

    • Si entonces no es la estructura de datos derecho de uso. Por ejemplo, podría usar un Multimap de Guava.

    • Si sin, (es decir, no importa cuál de los dos valores se asigna a, ya que sólo pueden diferir en una pequeña épsilon de todos modos), entonces usted debe estar bien.

+0

Esto es perfecto. Ambas respuestas son "no", así que estoy listo para ir. – MalcolmOcean

1

El problema con dobles en los mapas de árbol es exactamente lo mismo que lo es con dobles en mapa hash - Comparación de la igualdad.Si evitas las llamadas de treeMap.get(myDouble) y te quedas con las consultas de rango (por ejemplo, usando submap), estarás bien.

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); 
} 

Esto imprime

1.2301=the 
1.231=brown 

ver este fragmento en ideone.

0

Si solo quiere que se clasifiquen, hay mejores colecciones (por ejemplo, SortedSet). También puede usar cualquier lista y usar las utilidades para clasificar (creo que están en java.util.Collection).

Utilice solo mapas y tablas cuando desee acceder directamente a un elemento por su clave.

1

Si sólo desea ordenar ellos, lo mejor sería crear un objeto envoltorio alrededor del doble y el objeto, implementar la interfaz "comparable" en esta envoltura, y el uso de una colección sencilla para ordenarlos