如何在java中创建双向地图

sek*_*t64 55 java data-structures

我需要一个数据结构来以1:1的关系存储string-int值对,并且能够从对应的任何一种方式查找.

我用Hashtable和String数组编写了一个类,并将数据存储了2次,并使用内置函数进行查找.

我的问题是,是否有更好的方法来实现这一目标?并且更好,我的意思是效率高,不存储数据2次,最好不要写大量的代码:P.

coo*_*ird 52

看起来你可能正在寻找一个bimap.

Google Collections(现在是Guava的一部分)包含BiMap一些带有一些实现的接口.

BiMap文档:

bimap(或"双向映射")是一种映射,它保留其值及其键的唯一性.此约束使bimaps支持"反向视图",这是另一个包含与此bimap相同的条目但具有反向键和值的bimap.

BiMap.inverse方法似乎返回a Map,其中值为键,键为值,因此Map可用于调用get值并检索键.

另外,Map返回的inverse是底层数据的视图,因此它不必为原始数据制作额外的副本.

BiMap.inverse方法文档:

返回此bimap的反向视图,该视图将每个bimap的值映射到其关联的键.两个bimaps由相同的数据支持; 对一个的任何更改都将出现在另一个中.


Gop*_*opi 30

你可以这样做一个简单的实现.请注意,此实现中不会复制数据.只有参考文献!我添加了add和get的实现.运动中删除和其他所需的方法:)

public class TwoWayHashmap<K extends Object, V extends Object> {

  private Map<K,V> forward = new Hashtable<K, V>();
  private Map<V,K> backward = new Hashtable<V, K>();

  public synchronized void add(K key, V value) {
    forward.put(key, value);
    backward.put(value, key);
  }

  public synchronized V getForward(K key) {
    return forward.get(key);
  }

  public synchronized K getBackward(V key) {
    return backward.get(key);
  }
}
Run Code Online (Sandbox Code Playgroud)

其中,即使是"价值",其应用程序的责任也是独一无二的.用法示例:

TwoWayHashmap twmap = new TwoWayHashmap<String, String>();
twmap.add("aaa", "bbb");
twmap.add("xxx", "yyy");
System.out.println(twmap.getForward("xxx"));
System.out.println(twmap.getBackward("bbb"));
Run Code Online (Sandbox Code Playgroud)

  • 在没有Guava的BiMap的情况下,这将是一个有趣的方法.但是,我建议你让这个类实现Map接口. (2认同)

Ale*_*x B 11

Apache Commons还包括BidiMap(Bi Directional Map).

定义允许在键和值之间进行双向查找的映射.

此扩展Map表示一个映射,其中键可以查找值,值可以轻松地查找键.此接口扩展了Map,因此可以在需要地图的任何地方使用.界面提供逆映射视图,可以完全访问BidiMap的两个方向.