Mam dane zorganizowane w rodzaju „klucz-klucz”, a nie „klucz-wartość”. To jest jak HashMap, ale będę potrzebować wyszukiwania O (1) w obu kierunkach. Czy istnieje nazwa tego typu struktury danych i czy coś takiego jest zawarte w standardowych bibliotekach Javy? (a może Apache Commons?)
Mógłbym napisać własną klasę, która zasadniczo używa dwóch lustrzanych map, ale wolałbym nie wymyślać koła na nowo (jeśli to już istnieje, ale po prostu nie szukam odpowiedniego terminu).
Oprócz Apache Commons, Guava ma również BiMap .
źródło
Oto prosta klasa, której użyłem, aby to zrobić (nie chciałem mieć kolejnej zależności od strony trzeciej). Nie oferuje wszystkich funkcji dostępnych w Mapach, ale to dobry początek.
źródło
Jeśli nie wystąpią żadne kolizje, zawsze możesz dodać oba kierunki do tej samej HashMap :-)
źródło
Tutaj moje 2 centy.
Lub możesz użyć prostej metody z rodzajami. Bułka z masłem.
Oczywiście musisz mieć mapę z unikalnymi wartościami. W przeciwnym razie jeden z nich zostanie wymieniony.
źródło
Zainspirowany odpowiedzią GETah, zdecydowałem się napisać coś podobnego z kilkoma ulepszeniami:
Map<K,V>
-Interfaceput
(przynajmniej mam nadzieję, że to tutaj gwarantuję)Użycie jest jak normalna mapa, aby uzyskać odwrotny widok wywołania mapowania
getReverseView()
. Treść nie jest kopiowana, zwracany jest tylko widok.Nie jestem pewien, czy jest to całkowicie niezawodne (w rzeczywistości prawdopodobnie nie jest), więc nie krępuj się komentować, jeśli zauważysz jakiekolwiek wady, a zaktualizuję odpowiedź.
źródło
Dość stare pytanie, ale jeśli ktoś inny ma blokadę mózgu, tak jak ja, i natknie się na to, mam nadzieję, że to pomoże.
Ja też szukałem dwukierunkowej HashMapy, czasami jest to najprostsza z odpowiedzi, która jest najbardziej przydatna.
Jeśli nie chcesz ponownie wymyślać koła i wolisz nie dodawać innych bibliotek lub projektów do swojego projektu, co powiesz na prostą implementację tablic równoległych (lub ArrayLists, jeśli wymaga tego projekt).
Gdy tylko poznasz indeks jednego z dwóch kluczy, możesz łatwo zażądać drugiego. Twoje metody wyszukiwania mogą więc wyglądać następująco:
Zakłada się, że używasz odpowiednich struktur zorientowanych obiektowo, w których tylko metody modyfikują te tablice / ArrayLists, bardzo łatwo byłoby zachować ich równoległość. Jeszcze łatwiejsze dla ArrayList, ponieważ nie musiałbyś przebudowywać, jeśli rozmiar tablic ulegnie zmianie, o ile dodasz / usuniesz w tandemie.
źródło