Как создать 2 пути карта в Java

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

Я записал класс с Хеш-таблицей и Массивом строк и хранил данные 2 раза и использовал созданный в функциях для поиска.

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

55
задан sekmet64 7 August 2010 в 00:06
поделиться

4 ответа

Похоже, вы ищете бимап.

Коллекции Google (теперь часть Guava ) содержат интерфейс BiMap с несколькими реализациями.

Из документации BiMap :

BIMAP (или «двунаправленная карта») - это отображение, сохраняющее единственность его ценности, а также ключи. Это ограничение позволяет использовать бимапы. чтобы поддержать "обратную точку зрения", которая другой бимап, содержащий то же самое записи как этот бимап, но с поменять местами ключи и значения.

Метод BiMap.inverse , похоже, возвращает Map со значениями в качестве ключей и ключами в качестве значений, так что Map может быть используется для вызова get значения и получения ключа.

Кроме того, карта , возвращаемая инверсией , является представлением базовых данных, поэтому не нужно делать дополнительные копии исходных данных.

Из документации метода BiMap.inverse :

Возвращает обратный вид этого bimap, который отображает каждый из значения к соответствующему ключу. Два бимапы поддерживаются теми же данными; любые изменения в одном из них появятся в разное.

52
ответ дан 7 November 2019 в 07:20
поделиться

Вы можете сделать такую ​​простую реализацию. Обратите внимание, что в этой реализации данные не копируются. Только ссылки есть! Я добавил реализацию для добавления и получения. remove и другой требуемый метод оставлены в качестве упражнения :)

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"));
30
ответ дан 7 November 2019 в 07:20
поделиться

Google Guava имеет BiMap , который делает то, что вы хотите.

5
ответ дан 7 November 2019 в 07:20
поделиться

Создайте хэш-карту, которая отображает объект в объект - затем вы можете использовать ту же карту для хранения String -> Integer и Integer -> String.

Когда вы добавляете пару строка / целое число, просто добавляйте ее в обоих направлениях к одной и той же карте.

-4
ответ дан 7 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: