Mapa dwukierunkowa w Javie? [duplikat]
To pytanie ma już odpowiedź tutaj:
- Mapa Dwukierunkowa 6 odpowiedzi
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.
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.
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"));
}
}
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.
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
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ść ->.
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