Подтвердить что ты не робот

Как создать двунаправленную карту в java

Мне нужна структура данных для хранения пар значений string-int в соотношении 1:1 и возможность слишком сильно искать их в обратном порядке.

Я написал класс с массивом Hashtable и String и дважды сохранил данные и использовал встроенные функции для поиска.

Мой вопрос в том, что есть ли лучший способ добиться этого? И я лучше понимаю, что я эффективен и не хранил данные 2 раза, и, желательно, не пишу тонны кода: P.

4b9b3361

Ответ 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.

Ответ 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 просто добавьте ее в оба пути к одной и той же карте.