Как создать 2-стороннюю карту в Java - PullRequest
55 голосов
/ 07 августа 2010

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

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

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

Ответы [ 6 ]

52 голосов
/ 07 августа 2010

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

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

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

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

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

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

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

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

30 голосов
/ 07 августа 2010

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

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"));
11 голосов
/ 24 мая 2012

Apache Commons также включает в себя BidiMap (двунаправленную карту).

Определяет карту, которая позволяет двунаправленный поиск между ключом и значениями.Карта представляет собой отображение, где ключ может искать значение, а значение может искать ключ с такой же легкостью.Этот интерфейс расширяет Map и может использоваться везде, где требуется карта.Интерфейс обеспечивает обратную карту, обеспечивая полный доступ к обоим направлениям BidiMap.

5 голосов
/ 07 августа 2010

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

4 голосов
/ 29 марта 2013

Использование Гуава ,

    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"));

читать полное руководство здесь.

0 голосов
/ 07 августа 2010

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

Когда вы добавляете пару string / int, просто добавьте ее в обе сторонына ту же карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...