Коллекция Java - уникальный ключ и уникальное значение - PullRequest
28 голосов
/ 03 апреля 2009

Мне нужна коллекция, которая может искать значение на основе ключа и наоборот. Для каждого значения есть один ключ, и для каждого ключа есть одно значение. Есть ли готовая к использованию структура данных, которая делает это?

Ответы [ 3 ]

33 голосов
/ 03 апреля 2009

BiMap от Google Guava выглядит так, как будто вам подойдет.

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

Или BidiMap из Коллекции Apache Commons :

Определяет карту, которая позволяет двунаправленный поиск между ключом и значениями.

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

8 голосов
/ 21 декабря 2013

Вы можете использовать BiMap из Коллекции Eclipse (ранее GS Collections).

BiMap - карта, которая позволяет пользователям выполнять поиск в обоих направлениях. И ключи, и значения в BiMap являются уникальными.

Основная реализация - HashBiMap.

inverse()

BiMap.inverse() возвращает представление, в котором позиция типа ключа и типа значения меняются местами.

MutableBiMap<Integer, String> biMap =
  HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));

put()

MutableBiMap.put() ведет себя как Map.put() на обычной карте, за исключением того, что выбрасывает при добавлении дублирующего значения.

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException

forcePut()

Это ведет себя как MutableBiMap.put(), но оно молча удаляет запись карты с тем же значением, прежде чем поместить пару ключ-значение в карту.

MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap);

Примечание: Я являюсь коммиттером для Eclipse Collections.

1 голос
/ 21 декабря 2013

В принятом ответе упоминается BiMap, но он стал более актуальным с библиотеками Google Guava.

A BiMap<K, V> это Map<K, V>, что

  • позволяет просматривать "инверс" BiMap<V, K> с помощью inverse()
  • обеспечивает уникальность значений, что делает values() a Set

Итак, вы можете получить такой код:

final BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("word", 1);
biMap.put("alpha", 2);
System.out.println(biMap.get("word")); // prints 1
System.out.println(biMap.inverse().get(1)); // prints word

Некоторые оговорки с этим объектом:

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