2012-05-22 19 views
51

Ho una semplice mappatura da intero a stringa in Java, ma ho bisogno di essere in grado di recuperare facilmente stringa da intero e anche intero da stringa. Ho provato Map, ma può recuperare solo stringa da intero, è un modo:Mappa bidirezionale in Java?

private static final Map<Integer, String> myMap = new HashMap<Integer, String>(); 
// This works one way: 
String myString = myMap.get(myInteger); 

// I would need something like: 
Integer myInteger = myMap.getKey(myString); 

C'è un modo giusto per farlo per averlo entrambe le direzioni?

Un altro problema è che ho solo un paio di valori costanti che non cambiano (1->"low", 2->"mid", 3->"high", in modo che non varrebbe la pena di andare per una soluzione complicata.

risposta

50

È possibile utilizzare l'API di Google per quella Collezioni , recentemente rinominato Guava, specificamente un BiMap

a bimap (o "mappa bidirezionale") è una mappa che conserva la unicità dei valori così come quella dei suoi tasti. Questo vincolo consente bimaps sostenere una "vista inversa", che è un'altra bimap contenente le stesse voci di questa bimap ma con chiavi invertite e valori .

+0

Vedi http://stackoverflow.com/a/39329395/5466401 –

16

Non esiste una mappa bidirezionale nell'API Java standard. Puoi anche gestire due mappe da solo o utilizzare lo BidiMap da Apache Collections.

4

Usa di BiMap

Google È più conveniente.

21

Creare Guava BiMap e ottenere valore inverso non è così banale.

semplice esempio:

import com.google.common.collect.BiMap; 
import com.google.common.collect.HashBiMap; 

public class BiMapTest { 

    public static void main(String[] args) { 

    BiMap<String, String> biMap = HashBiMap.create(); 

    biMap.put("k1", "v1"); 
    biMap.put("k2", "v2"); 

    System.out.println("k1 = " + biMap.get("k1")); 
    System.out.println("v2 = " + biMap.inverse().get("v2")); 
    } 
} 
5

è possibile inserire sia la chiave, coppia di valori e la sua inversa nella vostra struttura della mappa, ma avrebbe dovuto convertire l'intero in una stringa:

map.put("theKey", "theValue"); 
map.put("theValue", "theKey"); 

Utilizzando map.get ("theValue") restituirà "theKey".

E 'un modo rapido e sporco che ho fatto mappe costanti, che funziona solo per pochi gruppi di dati:

  • contiene solo 1 a 1 coppie
  • insieme di valori è disgiunto dalla set di chiavi (1-> 2, 2-> 3 break it)

Se si desidera conservare <Integer, String> si potrebbe mantenere un secondo <String, Integer> mappa per "mettere" il valore -> coppie di chiavi.

+5

funziona solo se la chiave e valore sono gli stessi, o forse se si utilizza 'Mappa ' – mlathe

+0

modificati per chiarimenti, grazie – Chicowitz

+0

Inoltre , tutte le chiavi e i valori dovrebbero essere diversi. –