2012-03-20 21 views
34

Puoi suggerire un tipo di mappa o una struttura di dati simile in cui possiamo ottenere sia il valore che la chiave l'uno dall'altro con uguale facilità. Vale a dire, ognuno può essere usato per trovare altro.Mappa bidirezionale

+3

È possibile creare una classe contenente due hasmap, una per ciascuna direzione e gestirli in parallelo. L'ovvio lato negativo è il raddoppio dello spazio di archiviazione e il tempo di esecuzione. –

+1

[java-hashmap-how-to-get-key-from-value] (http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value) – jaco0646

+0

Vedere questo risposta semplice http://stackoverflow.com/a/39329515/5466401 –

risposta

9

La soluzione più comune è l'utilizzo di due mappe. Puoi facilmente incapsularli in una classe con un'interfaccia amichevole estendendo AbstractMap. (Aggiornamento: Questo è il modo di Guava HashBiMap è implementato: due mappe)

Creazione di una nuova struttura di dati usando solo le matrici e le classi personalizzate presenta alcuni vantaggi. Le implementazioni della mappa sono involucri leggeri di una struttura dati che indicizza le chiavi. Dato che hai bisogno di due indici potresti anche usare due mappe complete.

28

Java non ha una mappa bidirezionale nella sua libreria standard.

Utilizzare ad esempio BiMap<K, V> da Google Guava.

+0

@Travis Grazie, collegamenti aggiornati. (I documenti API sono ancora su Google Code al momento). – Jesper

+0

Sì, ho notato che anche se si spera si trasferiranno in un posto più sicuro. – Travis

+0

@Travis Sono entrambi di Google, quindi probabilmente non rovinano il loro progetto ... – Jesper

5

Google Guava contiene un BiMap (mappa bidirezionale).

+0

Dovresti aggiornare il link per puntare a Github che stavo per ma pensavo potesse essere banale dato che il collegamento attuale funziona per adesso. – Travis

+0

A tempo debito. So che Google Code è in modalità di sola lettura. –

6

Prova anche il pacchetto Apache Commons Collections 4 BidiMap.

10

Se ritieni che sia doloroso importare alcune librerie di terze parti. Che ne dici di questa semplice lezione.

public class BiMap<K,V> { 

    HashMap<K,V> map = new HashMap<K, V>(); 
    HashMap<V,K> inversedMap = new HashMap<V, K>(); 

    void put(K k, V v) { 
     map.put(k, v); 
     inversedMap.put(v, k); 
    } 

    V get(K k) { 
     return map.get(k); 
    } 

    K getKey(V v) { 
     return inversedMap.get(v); 
    } 

} 

Assicurarsi che la classe K e V abbia un'implementazione hashCode corretta.

+0

Il problema è che questa non è una raccolta, quindi tutti i metodi di raccolta non funzionano. – Justin

+0

vero. Ho finito per aggiungere quello che mi serve – Javanator

2

bene per il caso medio in cui è necessario un dizionario come quello, non vedo nulla di sbagliato con una soluzione KISS, basta mettere la chiave e il valore viceversa, salvando il sovraccarico di una seconda mappa o anche la libreria solo per quello scopo:

myMap.put("apple", "Apfel"); 
myMap.put("Apfel", "apple"); 
+1

Si noti che questo funziona solo se la chiave e il valore sono dello stesso tipo e non si saprà più quale sia la chiave e quale è il valore. Che può andare bene in alcuni casi. – Literallie