Mapa dwukierunkowa w Javie? [duplikat]

To pytanie ma już odpowiedź tutaj:

Mam proste mapowanie typu integer-to-string w Javie, ale muszę być w stanie łatwo pobrać string z integer, a także integer z string. Próbowałem Map, ale może pobierać tylko string z integer, jest to jeden sposób:

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 jest na to właściwy sposób mieć obie strony?

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

Author: husayt, 2012-05-22

6 answers

Możesz do tego użyć API kolekcji Google, ostatnio przemianowanego na Guava, a konkretnie BiMap

Bimap (lub "mapa dwukierunkowa") jest mapą, która zachowuje wyjątkowość jego wartości, jak i kluczy. To ograniczenie umożliwia bimapy do obsługi "widoku odwrotnego", który jest kolejnym bimapem zawierające te same wpisy co ten bimap ale z odwróconymi klawiszami i wartości.

 60
Author: epoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-21 10:21:26

Create Guava BiMap and get inverted value is not so trivial.

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"));
  }
}
 25
Author: Michal Z m u d a,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-21 07:15:48

W standardowym API Java nie ma mapy dwukierunkowej. Możesz samodzielnie utrzymywać dwie mapy lub użyć BidiMap z kolekcji Apache.

 19
Author: Mathias Schwarz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 11:10:53

Apache commons collections has a BidiMap

 8
Author: hage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 11:12:56

Możesz wstawić zarówno klucz, parę wartości, jak i jej odwrotność do struktury mapy, ale musisz przekonwertować liczbę całkowitą na ciąg znaków:

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

Za pomocą mapy.get ("theValue") zwróci"theKey".

Jest to szybki i brudny sposób, że zrobiłem stałe mapy, które będą działać tylko dla wybranych kilku zbiorów danych:

  • zawiera tylko 1 do 1 par
  • zbiór wartości jest oddzielony od zbioru kluczy (1->2, 2->3 breaks it)

Jeśli chcesz zachować <Integer, String> możesz zachować drugą mapę <String, Integer>, aby "umieścić" pary kluczy wartość ->.

 7
Author: Chicowitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 19:50:17

Użyj Google ' s BiMap

Jest to wygodniejsze.

 4
Author: BOSS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 02:46:20