Cómo mantener el orden de los elementos en la tabla hash
-
07-07-2019 - |
Pregunta
Tengo una tabla hash. El método values ??() devuelve valores en un orden diferente del orden en el que estoy insertado. ¿Cómo puedo obtener los valores en el mismo orden en que los inserté? Usar LinkedHashmap es una alternativa pero no está sincronizado.
Solución
Utilice un LinkedHashMap
.
Tabla hash y lista vinculada implementación de la interfaz
Map
, con orden de iteración predecible. Esta la implementación difiere deHashMap
en que mantiene una lista doblemente vinculada corriendo a través de todas sus entradas. Esta lista vinculada define la iteración ordenar, que normalmente es el orden 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 un la tecla se vuelve a insertar en el mapa. (UNA la tecla k se reinserta en un mapa m sim.put (k, v)
se invoca cuandom.containsKey (k)
devolveríatrue
inmediatamente antes de la invocación.)
combinado con Collections.synchronizedMap ()
.
Entonces, por ejemplo:
Map<String, String> map = Collections.synchronizedMap(
new LinkedHashMap<String, String>());
Otros consejos
Puede ajustar un LinkedHashMap
y sincronizar o puede usar la utilidad Collections.synchronizedMap
para crear un LinkedHashMap
:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Desde JavaDoc:
Si varios subprocesos acceden a un mapa de hash vinculado simultáneamente, y al menos uno de los subprocesos modifica el mapa estructuralmente, debe sincronizarse externamente. Esto generalmente se logra mediante la sincronización de algún objeto que encapsula naturalmente el mapa. Si no existe tal objeto, el mapa debe estar "envuelto" utilizando el método Collections.synchronizedMap. Esto se hace mejor en el momento de la creación, para evitar el acceso no sincronizado accidental al mapa
Estoy bastante seguro de que la razón por la que las tablas hash no están ordenadas es para ayudar al almacenamiento y la 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).
Una tabla hash está inherentemente desordenada, por lo que está utilizando una estructura de datos incorrecta. Como no especifica qué idioma está utilizando, no puedo sugerir una alternativa, pero necesita algún tipo de conjunto de clave / valor ordenado.
Si jdk1.6 solo tiene dos tipos de mapas ordenados EnumMap y LinkedHashMap. Ambos no están sincronizados. Si solo necesita recordar el pedido, use
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
si quieres ordenar, usa ConcurrentSkipListMap