2012-01-16 7 views
6

Necesito un Mapa, pero cuando llamo get (clave, n) debería devolver no solo todos los registros con el valor clave buscado, sino también todos los n últimos bits significativos de la clave son los mismos que la clave de búsqueda (por ejemplo, aplicando algo como la clave & (1 < < (n + 1) -1)).¿Hay un mapa con una longitud de clave variable en el mundo de Java?

¿Hay algo como esto ya implementado en Java?

+0

¿Por qué no simplemente hacer que la clave real sea solo los n bits menos significativos de la clave calculada? –

+0

@GregS: Creo que el OP quiere que 'n' se dé sobre la marcha, por consulta. – amit

+0

Claramente, algo tan específico como esto no está disponible en la biblioteca estándar. La pregunta es: ¿no puedes usar los n últimos bits significativos como la clave y una lista como el valor? ¿Por qué especificar una clave que no puede usar realmente? – Viruzzo

Respuesta

10

No del todo, pero puede usar un NavigableMap.subMap para implementar esto. p.ej.

NavigableMap<Integer, Value> map = 
int keyBase = key & ~((1 << n)-1); 
Map<Integer, Value> subMap = map.subMap(keyBase, true, keyBase + (1 << n), false); 

Si quieres Búsqueda en base a los bits más bajos en lugar de los bits más altos, hay que invertir los bits antes de añadir y búsqueda. Esto agrupará el bit más bajo, el segundo bit más bajo y el tercer bit más bajo, etc.

+1

Creo que necesita invertir los bits de la clave, porque el OP desea conservar los bits menos significativos, no los más significativos. – dasblinkenlight

+0

Sí, @dasblinkenlight. Parece que el código anterior acepta las claves con los mismos bits '(64 - (n - 1))' * más a la izquierda * en lugar de los bits 'n' * más a la derecha *. – toto2

+0

He agregado un comentario sobre cómo ordenar primero por el bit más bajo. –

2

HashMap no lo va a hacer, pero un TreeMap podría hacerlo.

Necesitará normalizar y revertir las claves (es decir, decidir cuántos bits desea conservar e invertir los bits para que los bits menos significativos sean los más significativos). Luego puede quitar los bits menos significativos (anteriormente los bits más significativos) de sus llaves, y usar búsquedas de rango en el mapa de árbol para encontrar su respuesta.

Cuestiones relacionadas