У меня есть данные, которые организованы по типу «ключ-ключ», а не «ключ-значение». Это похоже на HashMap, но мне понадобится поиск O (1) в обоих направлениях. Есть ли название для этого типа структуры данных и включено ли что-нибудь подобное в стандартные библиотеки Java? (или, может быть, Apache Commons?)
Я мог бы написать свой собственный класс, который в основном использует две зеркальные карты, но я бы предпочел не изобретать велосипед (если он уже существует, но я просто не ищу правильный термин).
В дополнение к Apache Commons у Guava также есть BiMap .
источник
Вот простой класс, который я использовал для этого (я не хотел иметь еще одну стороннюю зависимость). Он не предлагает все функции, доступные в Картах, но это хорошее начало.
источник
Если коллизий не происходит, вы всегда можете добавить оба направления в одну и ту же HashMap :-)
источник
Вот мои 2 цента.
Или вы можете использовать простой метод с дженериками. Кусок пирога.
Конечно, у вас должна быть карта с уникальными значениями. В противном случае один из них будет заменен.
источник
Вдохновленный ответом GETah, я решил сам написать нечто подобное с некоторыми улучшениями:
Map<K,V>
-Interfaceput
(по крайней мере, я надеюсь гарантировать это настоящим)Использование похоже на обычную карту, чтобы получить обратный вид на вызов сопоставления
getReverseView()
. Контент не копируется, возвращается только представление.Я не уверен, что это полностью защищено от дурака (на самом деле, вероятно, это не так), поэтому не стесняйтесь комментировать, если вы заметите какие-либо недостатки, и я обновлю ответ.
источник
Довольно старый вопрос, но если у кого-то еще есть блокировка мозга, как у меня, и он наткнется на это, надеюсь, это поможет.
Я тоже искал двунаправленную HashMap, иногда самые простые ответы оказываются наиболее полезными.
Если вы не хотите изобретать колесо заново и предпочитаете не добавлять в проект другие библиотеки или проекты, как насчет простой реализации параллельных массивов (или ArrayLists, если этого требует ваш дизайн).
Как только вы узнаете индекс одного из двух ключей, вы можете легко запросить другой. Итак, ваши методы поиска могут выглядеть примерно так:
Это предполагает, что вы используете правильные объектно-ориентированные структуры, где только методы изменяют эти массивы / ArrayLists, было бы очень просто сохранить их параллельность. Еще проще для ArrayList, так как вам не придется перестраивать, если размер массивов изменится, если вы добавляете / удаляете в тандеме.
источник