2009-04-02 2 views
27

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

ответ

32

BiMap от Google Guava похоже, что он подойдет вам.

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

Или BidiMap из Apache Commons Collections:

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

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

7

Вы можете использовать BiMap от Eclipse Collections (ранее 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, коллекций.

1

Принятый ответ упоминает BiMap, но он стал more up-to-date с библиотеками Гуавы.

BiMap<K, V> является Map<K, V>, что

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

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

Некоторых предостережения с этим объектом:

  • Вы не сможете добавить неуникальное значение, или вы получите IllegalArgumentException. Вы можете использовать forcePut(key, value), но это будет override the existing key-value pair.
Смежные вопросы