2012-05-23 14 views
5

¿Hay alguna clase en Java que tenga una matriz de elementos ordenados y optimizados para una búsqueda rápida?¿Lista o conjunto machacado e indexado?

I.e. Necesito recuperar elementos tanto por índice numérico (como en Vector) como por hash (como en HashMap).

LinkedHashMap no coincide

Creo LinkedHashMap no coincide ya que garantiza el orden, pero no permiten acceder rápidamente por el índice (número de posición). Según la descripción, será necesario atravesar toda la cadena para encontrar una posición determinada. Esto es lo que cualquier Collection puede con el iterador.

EDITAR 2

es decir tanto la búsqueda por clave como por índice debe ser rápida, no solo por clave.

Respuesta

2

Puede usar un Map para recuperar rápidamente elementos mediante hash. Por definición, un Map está desordenado y hablar de índices no tiene mucho sentido. El uso de un LinkedHashMap podría ser de utilidad, ya que garantiza que el orden de inserción se conserva en la iteración tiempo, aunque el acceso a un elemento por el índice será todavía necesita algún tipo de procesamiento adicional, algo como esto:

map.entrySet().toArray()[index] // mind the casts, etc. 

Si sus cambios de mapa con poca frecuencia, lo anterior funcionará muy bien si almacena en caché el conjunto y compruebe si el tamaño del mapa ha cambiado antes de acceder a una entrada por índice, creando una nueva matriz solo cuando se haya detectado un cambio de tamaño. Por otro lado, si el mapa cambia con frecuencia, deberá volver a crear la matriz en cada acceso, creando una estructura de datos con un rendimiento deficiente.

+0

Creo que el método 'toArray()' escanea toda la colección, lo que hará que todo el asunto carezca de sentido. –

+0

@SuzanCioc de hecho. Es por eso que declaro en mi respuesta, tiene sentido solo si su mapa cambia con poca frecuencia y puede almacenar en caché la matriz –

2

Puedes probar LinkedHashSet, creo.

+0

Esto no resuelve el problema de cómo acceder a un elemento dado su índice. –

1

use LinkedHashMap. Esto le permitirá recuperar los elementos a través de la clave. Y también puede recuperar los elementos en la misma secuencia que almacenó en él.

1

creo que estás buscando LinkedHashMap

A partir de los documentos: mesa

hash y lista enlazada implementación de la interfaz del mapa, con orden de iteración predecible. Esta implementación difiere de HashMap en que mantiene una lista doblemente enlazada que se ejecuta a través de todas sus entradas. Esta lista vinculada define el orden de iteración, que normalmente es el orden en el que las claves se insertaron en el mapa (orden de inserción). Tenga en cuenta que el orden de inserción no se ve afectado si una clave se vuelve a insertar en el mapa. (Una clave k se reinserta en un mapa m si m.put (k, v) se invoca cuando m.containsKey (k) devolvería verdadero inmediatamente antes de la invocación).

Cuestiones relacionadas