2010-06-22 12 views
9

La classe MultiValueMap (raccolte di risorse di Apache) facilita il lavoro con una mappa i cui valori sono Collezioni. Sto cercando una classe che renda facile lavorare con una mappa le cui chiavi sono oggetti e valori sono mappe.Mappa della struttura dati di Maps

Utilizzo Java 1.4, quindi non posso utilizzare Google Collections o generici.

+0

Da che parte devi essere una mappa? Stai mappando dalla mappa all'oggetto, dall'oggetto alla mappa o dalla mappa alla mappa? – MikeD

+0

Non puoi semplicemente fare Map ? O vuoi essere in grado di fare qualcosa come map.put (key1, key2, value)? – Dave

+0

Non che sia eccessivamente rilevante, suppongo, ma sono curioso: quale compagnia/industria (nello specifico come ci stai dicendo) richiede ancora Java 1.4? Anche Java 5 è stato messo fine alla vita. Java 1.4 è stato EOLd per quasi 2 anni già. –

risposta

7

La mappa delle mappe è in realtà una struttura ad albero senza un singolo nodo radice (oltre a una mappa di mappe di mappe ...).

È possibile guardare Composite pattern che è ampiamente utilizzato per l'implementazione di strutture ad albero (se i loro componenti hanno lo stesso tipo che non è il caso come ritengo).

Un'altra soluzione è implementare un modello di dominio semplice. Sarà molto più chiaro da leggere e facile da mantenere qualcosa come:

school.getPupil ("John Doe").getMark ("Math") 

di

school.get ("John Doe").get ("Math") 
4

La collezione Map regolare lavora per questo:

Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>(); 
    Object newObject = new String("object as string"); 
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = mapOfMaps.get(newObject); 

In realtà, se si Non sei preoccupato per la sicurezza del tipo, puoi inserire tutto ciò che vuoi nella sezione del valore:

Map<Object,Object> mapOfWhatever = new LinkedHashMap<Object,Object>(); 
    Object newObject = new String("object as string"); 
    mapOfWhatever.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = (Map<Object, Object>) mapOfWhatever.get(newObject); 
+0

In genere uno non vuole avere preoccuparsi se una data (prima) chiave è già in 'mapOfMaps', ad es quando si esegue 'mapOfMaps.get (" firstKey "). put (" secondKey ", value)'. Ad esempio, le mappe di Python hanno un [metodo 'setdefault'] (http://docs.python.org/2/library/stdtypes.html#dict.setdefault) per questo scopo. –

1

Se hai uno map:{string,map:{string,thing}} (volutamente non utilizzando la sintassi Java per evitare l'intera attività Java1.4/Java5), devi anche considerare se invece dovresti modellarlo come map:{tuple:{string,string},thing}. Se le ricerche multi-livello sono dominanti, è una buona alternativa (a condizione di implementare un buon tuple valido per equals() e hashCode() in modo intelligente), ma se si eseguono molti inserimenti e eliminazioni, è meno utile.

L'intelligenza in hashCode probabilmente significa solo trovare un modo ragionevole per mescolare i bit dai codici hash dei contenuti insieme. Se ci si aspetta che i valori dei membri provengano da insiemi disgiunti (ad esempio nomi e occupazioni), è possibile combinarli XOR - imperfetti, ma economici e veloci - ma se hai meno controllo/certezza, allora devi fare qualcos'altro come bene (ad esempio, ruotare i bit di uno dei valori precedenti allo XOR).

Problemi correlati