Как создать двунаправленную карту в java
Мне нужна структура данных для хранения пар значений string-int в соотношении 1:1 и возможность слишком сильно искать их в обратном порядке.
Я написал класс с массивом Hashtable и String и дважды сохранил данные и использовал встроенные функции для поиска.
Мой вопрос в том, что есть ли лучший способ добиться этого? И я лучше понимаю, что я эффективен и не хранил данные 2 раза, и, желательно, не пишу тонны кода: P.
Ответы
Ответ 1
Кажется, что вы можете искать битму.
Коллекции Google (теперь часть Guava) содержит BiMap
с несколькими реализациями.
Из документации BiMap
:
Бимап (или "двунаправленная карта" ) является отображение, сохраняющее единственность его ценности, а также ключи. Это ограничение допускает бимап для поддержки "обратного обзора", который другой бимап, содержащий тот же как этот бимап, но с обратные ключи и значения.
Метод BiMap.inverse
возвращает Map
со значениями в качестве ключей, а ключи - как значения, так что Map
можно использовать для вызова get
для значения и получения ключа.
Кроме того, Map
, возвращаемый inverse
, представляет собой представление базовых данных, поэтому ему не нужно делать дополнительные копии исходных данных.
Из документации метода BiMap.inverse
:
Возвращает обратный вид этого бимап, который отображает каждый из этих бимапов значения к соответствующему ключу. Два бимапы поддерживаются одними и теми же данными; любые изменения в один будут отображаться в другие.
Ответ 2
Вы можете сделать простую реализацию следующим образом. Обратите внимание, что данные не копируются в этой реализации. Только ссылки! Я добавил реализацию для добавления и получения. удалить и другой необходимый метод оставлены как упражнение:)
public class TwoWayHashmap<K extends Object, V extends Object> {
private Map<K,V> forward = new Hashtable<K, V>();
private Map<V,K> backward = new Hashtable<V, K>();
public synchronized void add(K key, V value) {
forward.put(key, value);
backward.put(value, key);
}
public synchronized V getForward(K key) {
return forward.get(key);
}
public synchronized K getBackward(V key) {
return backward.get(key);
}
}
И, конечно же, его ответственность за применение даже "ценностей" уникальна. Пример использования:
TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));
Ответ 3
Apache Commons также включает BidiMap (двунаправленная карта).
Определяет карту, которая позволяет двунаправленный поиск между ключом и значениями.
Эта расширенная Карта представляет собой отображение, в котором ключ может искать значение и значение может искать ключ с одинаковой легкостью. Этот интерфейс расширяет Карта и поэтому могут использоваться везде, где требуется карта. Интерфейс обеспечивает обратное отображение карты, обеспечивая полный доступ к обоим направлениям от BidiMap.
Ответ 4
Google Collections Framework имеет BiMap делает то, что вы хотите.
Ответ 5
Используя Guava,
HashBiMap<String, String> map = HashBiMap.create();
map.put("name", "Sohail");
map.put("country", "Pakistan");
Log.d("tag", "name is " + map.get("name"));
BiMap<String, String>invmap= map.inverse();
Log.d("tag", "Pakistan is a " + invmap.get("Pakistan"));
прочитайте полный учебник здесь.
Ответ 6
Создайте хэш-карту, которая сопоставляет Object to Object - тогда вы можете использовать ту же карту для хранения String → Integer и Integer → String.
При добавлении пары string/int просто добавьте ее в оба пути к одной и той же карте.