Qual è la migliore struttura dati per memorizzare 2 chiavi e 3 valori?

1

Bene, ho due chiavi e tre valori per questo. Dì chiave1, chiave2, valore1, valore2, valore3. In futuro i valori possono essere aumentati come value4, value5 così via.

Ho bisogno di ottenere i valori (valore1, valore2, valore3) sia da key1 o key2. La chiave 1 sarà unica e la chiave 2 non lo è.

Attualmente, sto usando ENUM per questa configurazione come sotto

public enum EnumClass { Object1(Key1,Key2,Value1,Value2,Value3); }

Ci saranno più di 100 oggetti. A partire da ora, sto usando questa classe ENUM con 2 mappe Map<key1,ENUM> e Map<key2,ENUM>

C'è qualche altra soluzione che sia migliore della soluzione attuale?

    
posta Jey Ganesh 15.04.2016 - 11:35
fonte

2 risposte

4

Se key2 non è univoco, non puoi utilizzare Map per memorizzare una relazione key2 -> (value1,value2,value3) , poiché una mappa asserisce una relazione chiave / valore 1-1.

Inizialmente non mi preoccuperei delle prestazioni, visto che hai 100 di oggetti (a differenza di milioni), e preferirei la semplicità / leggibilità per cominciare. Nascondi la tua ricerca dietro un'interfaccia (in modo che tu possa cambiare la tua implementazione in un secondo momento, se lo desideri / necessario), e magari semplicemente memorizzi una tabella di key1 / key2 / values, e esegui la tua ricerca semplicemente sfogliando e costruendo una lista di le partite.

I metodi del tuo repository assomigliano a:

ResultType byKey1(Key k);
Collection<ResultType> byKey2(Key k);

Se key1 e key2 sono distinti , puoi implementare una ricerca più rapida facendo qualcosa del tipo:

Map<Key,List<ResultType>>

quindi una ricerca di key1 ti darebbe un elenco di un (value1/value2/value3) , mentre una ricerca di key2 ti darebbe un elenco di 'n' (value1/value2/value3) . Ciò richiederebbe tuttavia una configurazione dei dati iniziale più complessa. Quindi suggerirei una semplice implementazione iniziale della tabella dietro una facciata. Puoi implementare le ottimizzazioni in seguito, se necessario.

    
risposta data 15.04.2016 - 11:44
fonte
0

Potresti considerare l'uso della tabella di Guava . Le istanze di questa interfaccia creano una mappatura tra due elementi e una terza. Nel tuo caso, sarebbe una mappa tra (Key1, Key2) e List (o un oggetto Value, a seconda del significato dei valori extra. Un'implementazione tipica è la HashBasedTable, che non è sorprendentemente basata sugli hashcode chiave.

Questa classe funziona solo se Key1 e Key2, insieme, sono distinti. Ma comunque, se non è così, perché li chiami chiavi?

    
risposta data 16.04.2016 - 17:56
fonte

Leggi altre domande sui tag