2010-06-18 6 views
11

Me tropecé con multi_index en una alondra anoche mientras golpeaba mi había contra una colección a la que tengo que acceder mediante 3 valores clave diferentes, y también para reequilibrar la semántica de la matriz. Bueno, obtuve uno de mis dos deseos (3 valores clave diferentes) en boost :: multi_index.¿Hay un equivalente de boost :: multi_index para Java en algún lugar?

Tengo curiosidad si existe algo similar en el mundo de Java.

+0

puede ser una exageración (de ahí comentario), ¿ha considerado una base de datos integrada para esto? Hay muchos DBs livianos que puede incrustar y ejecutar en la memoria, supongo que depende de sus requisitos de rendimiento ... – Nim

Respuesta

-2

que no tienen idea de lo que impulso :: medios multi_index, pero basado en el resto de su pregunta, creo que podría estar hablando de un multi key map

+0

No, lo siento. Ese es un ejemplo de contenedor de clave compuesta de tipo débil. boost :: multi_index está fuertemente tipado, pero lo más importante es que tiene múltiples claves independientes. Es decir. En un contenedor de varias personas, puede buscar a una persona por nombre, número de seguro social o fecha de nacimiento. (obviamente, el nombre y la fecha de nacimiento no serán claves únicas) – MSalters

1

Creo que la respuesta corta es no, no hay equivalente obvio.

La clase boost multi-index está muy fuertemente modelada, lo que no es fácilmente traducible en Java. Hay genéricos, pero no son para nada iguales. (How are Java generics different from C++ templates? Why can't I use int as a parameter?).

Entonces, sin plantillas, ¿cómo sería la clase multi-índice?

Imagino que tendría su clase de datos, p. Persona, que contiene miembros de índice como una implementación de Mapa. En este punto, usted tiene opciones:

  1. añadir un poco de "índices" directamente a la clase Persona (como algunos tablas hash) y escribe las operaciones de búsqueda funciones. Administre la sincronización del índice dentro de la clase Persona .
  2. Escribir una clase de "IndexProvider" que desacopla la funcionalidad índice por completo de la persona - tendría que ser capaz de crear dinámicamente diferentes tipos de índices y me imagino que lo haría sincronización de mango a través de devoluciones de llamada.
  3. Algunos mezcla de 1) y 2) - al igual que una clase base abstracta para funcionalidad índice , que no desacoplar adecuadamente el comportamiento, pero proporciona algunas reutilización de código.

Creo que, en la mayoría de los casos 1) es el más fácil de escribir, más fácil de mantener y es probablemente el más eficiente. 2) parece una sobreingeniería.

La otra opción, si tiene muchas estructuras de datos que necesitan indexación, es almacenarlas en una base de datos.

+0

He publicado una nueva respuesta sobre google guava. Podría ser una solución – gavioto

2

Acabo de terminar MultiIndexContainer en Java: http://code.google.com/p/multiindexcontainer/wiki/MainPage. Sé que no es el equivalente completo de boost multi_index_container, pero tal vez podría ser suficiente para su requerimiento.

+0

Gracias, voy a echar un vistazo. –

+0

interfaz se ve bien y en realidad resuelve el requisito de múltiples índices. – Alex

+0

Guau, tal vez sea hora de resucitar mi viejo proyecto después de tanto tiempo :-) Por cierto lo he exportado a github https://github.com/Kamosh/multiindexcontainer pero es difícil decir en qué forma se encuentra. –

-1

creo que se puede encontrar la respuesta en la biblioteca de guayaba Google. Probablemente multimaps resuelva sus necesidades.

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained

Como se ha comentado en estos temas:

+0

'multi_index' significa que puede poner un valor con varias claves adentro y tener una agrupación por cada tecla. imagine algo así como un mapa de archivos, una vez codificado por nombre y una vez codificado por extensión, etc. – Alex

Cuestiones relacionadas