双向地图

maw*_*wia 53 java dictionary

你能否建议一种地图或类似的数据结构,我们可以同样轻松地获得彼此的价值和关键.也就是说,每个都可以用于寻找其他.

Jes*_*per 41

Java在其标准库中没有双向映射.

例如BiMap<K, V>,使用Google Guava.


Jav*_*tor 25

如果您觉得导入某些第三方库很痛苦.这个简单的课怎么样?

public class BiMap<K,V> {

    HashMap<K,V> map = new HashMap<K, V>();
    HashMap<V,K> inversedMap = new HashMap<V, K>();

    void put(K k, V v) {
        map.put(k, v);
        inversedMap.put(v, k);
    }

    V get(K k) {
        return map.get(k);
    }

    K getKey(V v) {
        return inversedMap.get(v);
    }

}
Run Code Online (Sandbox Code Playgroud)

确保K和V类具有正确的hashCode实现.

  • 嗯,这个 BiMap 方法可以实现 Map&lt;K,V&gt; 对吧?然后它变成了一个集合。 (3认同)
  • 不是一个干净的方式imo。它必须是组合而不是继承的情况 (3认同)
  • 问题在于,这现在不是集合,因此所有集合方法都不起作用。 (2认同)
  • 您可以从`HashMap` 扩展并在内部保留一个反向映射。然后覆盖所有进行突变的方法,并添加相应的方法以通过值进行检索。 (2认同)
  • 此解决方案还有另一个问题。值不是唯一的,因此如果两个键指向相同的值,并且我们对这个值使用 getKey() ,我们将始终获得第二个键,而映射将保留该值的两个键。 (2认同)

Jon*_*oni 13

最常见的解决方案是使用两张地图.您可以通过扩展将它们轻松地封装在具有友好界面的类中AbstractMap.(更新:这是Guava的HashBiMap实现方式:两张地图)

除了数组和自定义类之外什么都不创建新的数据结构几乎没有什么优势.映射实现是索引键的数据结构的轻量级包装器.由于您需要两个索引,因此您可以使用两个完整的映射.


ker*_*vin 9

还可以尝试Apache Commons Collections 4 BidiMap Package.


Buh*_*ndi 5

Google Guava包含一个BiMap(双向地图).