Мне нужна коллекция, которая может искать значение на основе ключа и наоборот. Для каждого значения есть один ключ, и для каждого ключа есть одно значение. Есть ли готовая к использованию структура данных, которая делает это?Коллекция Java - уникальный ключ и уникальное значение
ответ
BiMap от Google Guava похоже, что он подойдет вам.
Бимап (или «двунаправленная карта») - это карта, которая сохраняет уникальность своих значений, а также ее ключей. Это ограничение позволяет бимакам поддерживать «обратный вид», который является еще одним бимапом, содержащим те же записи, что и этот бимап, но с отмененными ключами и значениями.
Или BidiMap из Apache Commons Collections:
Определяет карту, которая позволяет двунаправленный поиск между ключом и значениями.
Этот расширенный
Map
представляет собой отображение, в котором ключ может искать значение, а значение может искать ключ с одинаковой легкостью. Этот интерфейс расширяетMap
и поэтому может использоваться везде, где требуется карта. Интерфейс обеспечивает обратное отображение карты, обеспечивая полный доступ к обоим направлениямBidiMap
.
Вы можете использовать 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, коллекций.
Принятый ответ упоминает 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.