HashMap a tre elementi senza iterazione interna
-
06-07-2019 - |
Domanda
Qual è il modo migliore per implementare una hashMap in tre elementi? Ad esempio, vorrei usare una normale chiave String, ma la faccio mappare su due oggetti diversi. L'idea è come avere un elenco di elenchi, tranne per il fatto che il primo elemento è una chiave.
Sto cercando di evitare di scorrere l'elenco (quindi il comportamento è come una hashmap). Concorderesti che l'unico modo è costruire una nuova classe? Sembra un "HashMap3" L'oggetto (con i metodi di get1 (chiave) e amp; get2 (chiave)) sarebbe utile. Non sono sicuro di come configurarlo da solo.
Come posso creare la raccolta?
Soluzione
Se la chiave verrà sempre mappata su esattamente due oggetti, il modo più semplice per farlo è creare una classe Pair
che esiste solo per contenere i due oggetti. Quindi usi String come chiave e l'istanza Pair
come valore. Tuttavia, se la chiave può mappare arbitrariamente molti oggetti, allora l'IMO il modo migliore per farlo è quello di avere il valore memorizzato nella Mappa
essere un Collection
di qualche tipo.
Altri suggerimenti
Guarda google-collections Multimap
Una raccolta simile a una mappa, ma che può associare più valori con una sola chiave. Se chiami put (K, V) due volte, con la stessa chiave ma valori diversi, la multimappa contiene mappature dalla chiave ad entrambi valori.
Un hash di hash forse?
Sono d'accordo con Eddie e ho avuto un problema simile solo con molti valori, non due. Volevo che una ConcurrentHashMap Java contenesse una cache XML di documenti recuperati da un servizio Web e avevo bisogno di registrare varie informazioni insieme all'XML per supportare le strategie di sfratto della cache (ad esempio, Meno utilizzato di recente, Meno utilizzato di frequente).
La soluzione era solo quella di definire una classe di oggetti che contenesse quegli oggetti. Ho usato una classe nidificata privata all'interno della mia classe Cache, qualcosa del genere:
private static class CacheEntry
{
private String uri; // Key
private String fetched_xml; // The XML document (main value)
private long put_time;
private long expires_time;
private long size;
private long hits;
private long last_used_time;
}
La ConcurrentHashMap è stata codificata sull'URI e sembrava così:
private final Map<String, CacheEntry> cache;
[...]
cache = new ConcurrentHashMap<String, CacheEntry>(100, 0.75f, 3);
Questo codice aggiunge un nuovo documento XML alla cache:
CacheEntry value = new CacheEntry();
value.fetched_xml(fetched_xml);
value.uri = uri;
value.put_time = System.currentTimeMillis();
value.expires_time = representation.getExpirationDate().getTime();
value.size = bytes_fetched;
value.hits = 0;
value.last_used_time = 0;
cache.put(uri, value);
Modifica: Se devi mappare una chiave su un Elenco di n Oggetti in Java, puoi metterli in un file java.util.collections.ArrayList e usa ArrayList come valore della mappa.