一致且高效的双向数据结构实现(Java)

时间:2015-08-31 13:37:54

标签: java dictionary data-structures bidirectional

我需要在Java中实现双向地图,所以我尝试使用Guava和Commons的BiMap和BidiMap。但是,在对元素进行修改后,不会保持逆视图功能。以下是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的实现,可以预期这种行为,但它说明了问题。

所以问题是,是否存在可以处理这种情况的双向数据结构,具有任意类型的元素,并且仍然具有比成对数组更好的平均时间复杂度?

编辑:我不是试图解决这个问题或者避免这个问题,这更像是一个学术问题。我只是想知道这样的数据结构是否存在。也就是说,数据结构允许双向绑定,可变密钥和合理的时间复杂度。

1 个答案:

答案 0 :(得分:3)

您的问题不在于双向地图,而是假设您可以修改地图密钥。事实上,密钥基本上必须至少在其equalshashCode方法的行为(在哈希表支持的映射的情况下)或它们的比较方法(在二叉树的情况下)中是稳定的 - 支持的地图)。

也许您可以考虑删除一个元素,更改它,然后将其插回 - 这是满足实现约束的一种方法。