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.

¿Fue útil?

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 de HashMap 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 si    m.put (k, v) se invoca cuando    m.containsKey (k) devolvería true   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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top