2012-05-22 15 views
51

Mam proste mapowanie typu liczba całkowita na ciąg w Javie, ale muszę być w stanie łatwo pobrać ciąg z liczby całkowitej, a także liczbę całkowitą z ciągu. Próbowałem Mapa, ale można go pobrać tylko ciąg od liczby całkowitej, to jeden sposób:Mapa dwukierunkowa w Javie?

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); 

Czy istnieje dobry sposób, żeby to zrobić aby mieć go w obu kierunkach?

Innym problemem jest to, że mam tylko kilka wartości stałych, które nie zmieniają się (1->"low", 2->"mid", 3->"high", więc nie warto byłoby, aby przejść do skomplikowanego rozwiązania.

Odpowiedz

50

Można użyć zbiorach Google API dla że , niedawno przemianowany na Guava, a konkretnie do BiMap

a bimap (lub „dwukierunkowy map”) jest mapa, która zachowuje wyjątkowość jego wartości, a także, że jej klucze. to ograniczenie umożliwia bimaps wspierać "odwrócony widok", który jest kolejnym bimapem zawierające te same wpisy co ta bimapa, ale z odwróconymi kluczami i wartościami .

+0

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

16

Nie ma dwukierunkowej mapy w Java Standard API. Możesz zachować dwie mapy samodzielnie lub skorzystać z BidiMap z kolekcji Apache.

21

Utwórz Guava BiMap i uzyskaj wartość odwróconą nie jest tak banalna.

Prosty przykład:

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

Można wstawić zarówno klucz parę wartości i jej odwrotności do swojej strukturze mapy, ale musiałyby przekształcić Integer na ciąg:

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

Używanie map.get ("theValue") zwróci "theKey".

Jest to szybki i brudny sposób, że zrobiłem stale mapy, która będzie działać tylko do kilku wybranych zbiorów danych:

  • Zawiera tylko 1 do 1 pary
  • zbiór wartości jest rozłączne z zestaw kluczy (1-> 2, 2-> 3 rozkłada go)

Jeśli chcesz zachować <Integer, String> można utrzymać drugą <String, Integer> mapy, aby „położyć” wartość -> pary kluczy.

+5

działa tylko jeśli klucz i wartość są takie same, lub ewentualnie jeśli używasz 'map ' – mlathe

+0

edytowane wyjaśnienia, dzięki – Chicowitz

+0

Ponadto wiele , wszystkie klucze i wartości powinny być różne. –