2010-06-18 5 views
11

Mi sono imbattuto in multi_index su un'allodola la scorsa notte mentre martellavo il mio contro una raccolta a cui ho bisogno di accedere con 3 diversi valori chiave, e anche di riequilibrare la semantica dell'array. Bene ho ricevuto uno dei miei due desideri (3 diversi valori chiave) in boost :: multi_index.Esiste un equivalente di boost :: multi_index per Java in qualche luogo?

Sono curioso di sapere se qualcosa di simile esiste nel mondo Java.

+0

può essere eccessivo (da cui commento), avete considerato un DB embedded per questo? Ci sono molti DB leggeri che puoi incorporare ed eseguire in memoria, suppongo che dipenda dai tuoi requisiti di performance .... – Nim

risposta

-2

ho idea che cosa boost :: mezzi multi_index, ma sulla base del resto della tua domanda, penso che si potrebbe parlare di un multi key map

+0

No, mi dispiace. Questo è un esempio di contenitore chiave composito debolmente tipizzato. boost :: multi_index è fortemente digitato, ma soprattutto ha più chiavi indipendenti. Cioè in un multi_index_container di persone, puoi cercare una persona per nome, SSN o data di nascita. (ovviamente il nome e il DOB non saranno chiavi univoche) – MSalters

1

Penso che la risposta è no, non c'è nessun equivalente evidente.

La classe boost di multiindice è fortemente basata su modelli, che non è facilmente traducibile in Java. Ci sono dei farmaci generici, ma non sono affatto uguali. (How are Java generics different from C++ templates? Why can't I use int as a parameter?).

Quindi, senza modelli, come sarebbe la classe a più indici?

Immagino che avresti la tua classe di dati, ad es. Persona, contenente membri di indici come un'implementazione di mappa. A questo punto, avete scelte:

  1. aggiungere alcuni "indici" direttamente al classe Person (come alcuni Hashtables) e scrittura di ricerca funzioni. Gestire la sincronizzazione dell'indice all'interno della classe Persona .
  2. Scrivi un "IndexProvider" classe che disaccoppia la funzionalità dell'indice interamente da persona - avrebbe dovuto essere in grado di creare dinamicamente diversi indici tipi e mi immagino si farebbe sincronizzazione maniglia via callback.
  3. Alcuni mix di 1) e 2) - come una classe di base astratta per l'indice funzionalità, che non disaccoppiare correttamente il comportamento ma fornisce alcune riutilizzo del codice.

Penso che nella maggior parte dei casi 1) sia il più facile da scrivere, più facile da mantenere ed è probabilmente il più performante. 2) sembra un eccesso di ingegneria.

L'altra opzione, se si dispone di molte strutture di dati che richiedono l'indicizzazione, è quella di memorizzarle in un database.

+0

Ho postato una nuova risposta parlando di google guava. Potrebbe essere una soluzione – gavioto

2

Ho appena finito MultiIndexContainer in Java: http://code.google.com/p/multiindexcontainer/wiki/MainPage. So che non è l'equivalente completo di boost multi_index_container ma forse potrebbe essere sufficiente per le tue esigenze.

+0

Grazie, darò un'occhiata. L'interfaccia –

+0

sembra carina e risolve il requisito dell'indice multipla. – Alex

+0

Wow, forse il tempo di far risorgere il mio vecchio progetto, dopo così tanto tempo :-) BTW Ho esportato a GitHub https://github.com/Kamosh/multiindexcontainer ma difficile da dire in quale forma si tratta. –

-1

Penso che si può trovare per la risposta nella libreria di guava google. Probabilmente multimaps risolvono le tue esigenze.

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

Come ha commentato in queste discussioni:

+0

'multi_index' significa che puoi inserire un valore con più chiavi all'interno e avere un raggruppamento per ogni chiave. immagina qualcosa come una mappa di file, una volta digitata per nome e una volta digitata per estensione e così via. – Alex