Мне нужна была реализация двунаправленной карты на Java, поэтому я попытался использовать BiMap и BidiMap от Guava и Commons. Однако возможность обратного вида не сохраняется после изменения элемента. Вот пример с BiMap (такое же поведение с BidiMap):
BiMap<Set<String>, Set<String>> map = HashBiMap.create();
Set<String> foo = new HashSet<>();
foo.add("foo");
Set<String> bar = new HashSet<>();
bar.add("bar");
map.put(foo, bar);
map.get(foo); // returns [bar], ok
map.inverse().get(map.get(foo)); // returns [foo], ok
map.get(foo).add("someString");
map.get(foo); // returns [bar, someString], ok
map.inverse().get(map.get(foo)); // returns null, not ok <=
Конечно, такое поведение можно ожидать от реализации с использованием HashMaps, но оно иллюстрирует проблему.
Итак, вопрос в том, существует ли двунаправленная структура данных, которая может справиться с такой ситуацией, с элементами произвольных типов, и при этом иметь лучшую среднюю временную сложность, чем массив пар?
РЕДАКТИРОВАТЬ: я не пытаюсь решить эту проблему или избежать ее, это скорее академический вопрос. Я просто хочу знать, существует ли такая структура данных. То есть структура данных, допускающая двустороннюю привязку, изменяемые ключи и разумную временную сложность.
Set<>
в какой-нибудь стабильный объект. hashCode и сопоставимость. Например. простоclass Wrapper { Set<> wrapped = .. }
- person zapl   schedule 31.08.2015