2012-05-22 9 views
51

Ich habe eine einfache Integer-zu-String-Zuordnung in Java, aber ich muss in der Lage sein, einfach String von Integer und auch Integer von String abzurufen. Ich habe Map versucht, aber es kann nur String aus integer abrufen, dann ist es eine Art und Weise:Bidirektionale Karte 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); 

Gibt es einen richtigen Weg, es zu tun, es in beiden Richtungen zu haben?

Ein weiteres Problem ist, dass ich ein paar konstanten Werte nur haben, die nicht (1->"low", 2->"mid", 3->"high" ändern, so wäre es für eine komplizierte Lösung zu gehen, nicht wert sein.

Antwort

50

Sie das Google-Collections-API für das verwenden können vor kurzem umbenannt, um Guava, insbesondere eine BiMap

ein bimap (oder „bidirektionale Karte“) ist eine Karte, die die Einzigartigkeit ihrer Werte sowie die seiner Schlüssel bewahrt. Diese Einschränkung ermöglicht bimaps zu unterstützen eine "inverse Ansicht", die eine andere Bimapistenthält die gleichen Einträge wie dieser Bimap aber mit umgekehrten Tasten und Werte.

+0

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

16

In der Java-Standard-API gibt es keine bidirektionale Karte. Entweder können Sie zwei Karten selbst verwalten oder die BidiMap von Apache Collections verwenden.

4

Verwenden von Google BiMap

Es ist bequemer.

21

Erstellen Sie Guava BiMap und erhalten invertierten Wert ist nicht so trivial.

Einfaches Beispiel:

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

Sie fügen könnte sowohl den Schlüssel Wertpaar und seine Umkehrung in die Map-Struktur, sondern würde die Integer in einen String konvertieren müssen:

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

Verwendung map.get ("theValue") gibt dann "theKey" zurück.

Es ist eine schnelle und schmutzige Art und Weise, dass ich konstant Karten gemacht habe, die nur für einige wenige ausgewählten Datensätze arbeiten:

  • Enthält nur 1 bis 1 Paar
  • Sets von Werten sind dijunkt von der Reihe von Tasten (1-> 2, 2-> 3 bricht es)

Wenn Sie <Integer, String> behalten möchten Sie eine zweite <String, Integer> Karte halten könnte den Wert auf „put“ -> Schlüsselpaare.

+5

funktioniert nur, wenn Sie Ihre Schlüssel und Wert gleich sind, oder möglicherweise, wenn Sie 'Map verwenden' – mlathe

+0

zur Klärung bearbeitet, dank – Chicowitz

+0

Darüber , alle Schlüssel und Werte sollten unterschiedlich sein. –