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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top