2009-09-14 15 views
19

Tengo una tabla hash. El método values ​​() devuelve valores en un orden diferente del orden en el que estoy insertada. ¿Cómo puedo obtener los valores en el mismo orden en que inserté? Usar LinkedHashmap es una alternativa pero no está sincronizado.Cómo mantener el orden de los elementos en la tabla hash

+0

qué idioma está usando? –

+0

LinkedHashMap es una parte de Java. – jimyi

+0

estoy usando Java. JDK1.6 –

Respuesta

31

Utilice un LinkedHashMap.

tabla hash y vinculado implementación de la lista de la interfaz Map, con orden de iteración predecible. Esta implementación de difiere de HashMap en y mantiene una lista de doble enlace que se ejecuta en todas sus entradas. Esta lista vinculada define el orden de iteración , que normalmente es el pedido en el que se insertaron claves en el mapa (orden de inserción). Tenga en cuenta que el orden de inserción no se ve afectado si una clave es que se volvió a insertar en el mapa. (A clave k se reinserta en un mapa m si m.put(k, v) se invoca cuando m.containsKey(k) volvería true inmediatamente antes de la invocación.)

combinarse con Collections.synchronizedMap().

Así, por ejemplo:

Map<String, String> map = Collections.synchronizedMap(
    new LinkedHashMap<String, String>()); 
+0

Para aclarar: si no estoy buscando tener más de una banda de rodadura, acceda a este 'LinkedHashMap' a la vez, ¿aún así se lo recomendaría sincronizar? ¿O el 'LinkedHashMap' por sí mismo se consideraría suficiente? – blo0p3r

+1

@ blo0p3r El 'LinedHashMap' debería ser suficiente por sí mismo. –

1

Una tabla hash es intrínsecamente desordenada, por lo que está utilizando una estructura de datos incorrecta. Como no especifica qué idioma está utilizando, no puedo sugerir un alternativo, pero necesita algún tipo de conjunto de clave/valor ordenado.

+0

estoy usando Java. JDK1.6 –

2

Estoy bastante seguro de que la razón no están ordenados tablas hash es que ayuda al almacenamiento y velocidad de recuperación. Debido a esto, sugeriría usar una estructura externa para mantener el orden y simplemente usar la tabla hash para almacenar valores (para una búsqueda rápida).

4

Usted podría envolver un LinkedHashMap y sincronizar o puede utilizar la utilidad Collections.synchronizedMap para crear un sincronizado LinkedHashMap:

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

Desde el JavaDoc:

Si varios subprocesos tienen acceso a un mapa hash relacionado al mismo tiempo, y al menos uno de los hilos modifica estructuralmente el mapa, debe estar sincronizado externamente. Esto se logra normalmente sincronizando en algún objeto que naturalmente encapsula el mapa. Si no existe tal objeto, el mapa debe ser "ajustado" utilizando el método Collections.synchronizedMap. Esto se realiza mejor en el momento de la creación, para evitar el acceso accidental no sincronizado al mapa

+0

muchas gracias ... pero ¿será un éxito de rendimiento? –

+0

La sobrecarga de rendimiento será insignificante (literalmente nanosegundos). – Adamski

1

Si jdk1.6 tiene solo dos tipos de mapas ordenados EnumMap y LinkedHashMap. Ambos no están sincronizados.Si sólo tiene que recordar el orden, utilice

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

si quieres ordenada luego usar ConcurrentSkipListMap

Cuestiones relacionadas