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

Коллекция Java - уникальный ключ и уникальная ценность

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

4b9b3361

Ответ 1

BiMap из Google Guava похоже, вам это подойдет.

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

Или BidiMap из Коллекции сообщества Apache:

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

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

Ответ 2

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

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.

Ответ 3

В принятом ответе упоминается 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

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