如何在java中创建双向地图

时间:2010-08-07 11:06:11

标签: java data-structures

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

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

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

7 个答案:

答案 0 :(得分:52)

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

Google Collections(现在是Guava的一部分)包含一个BiMap界面,其中包含一些实现。

来自BiMap文档:

  

bimap(或“双向地图”)是一个   保留唯一性的地图   它的价值以及它的价值   键。此约束启用了bimaps   支持“逆视图”,即   另一个含有相同的bimap   作为这个bimap的条目,但有   反转键和值。

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

此外,Map返回的inverse是基础数据的视图,因此不必为原始数据制作额外的副本。

来自BiMap.inverse方法文档:

  

返回此视图的反向视图   bimap,映射每个bimap的   值与其关联的键。他们俩   bimaps由相同的数据支持;   任何更改都会出现在   其他

答案 1 :(得分: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);
  }
}

当然,即使是“价值观”,其应用程序的责任也是独一无二的。用法示例:

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"));

答案 2 :(得分:11)

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

  

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

     

此扩展Map表示键可以查找值的映射   并且值可以同样容易地查找键。此接口扩展   地图等可以在需要地图的任何地方使用。界面   提供反向地图视图,实现对两个方向的完全访问   BidiMap。

答案 3 :(得分:5)

Google Guava有一个BiMap可以满足您的需要。

答案 4 :(得分:4)

使用Guava

    HashBiMap<String, String> map = HashBiMap.create();

    map.put("name", "Sohail");
    map.put("country", "Pakistan");

    Log.d("tag", "name is " + map.get("name"));


    BiMap<String, String>invmap= map.inverse();

    Log.d("tag", "Pakistan is a " + invmap.get("Pakistan"));

阅读完整教程here.

答案 5 :(得分:0)

绝对不用在 lambda 中编写大量代码 →
从你的 Map<String,Integer> map 你得到倒置的地图

Map<Integer,String> inverted = map.keySet().stream().collect(
    toMap( s -> map.get( s ), s -> s ) );

答案 6 :(得分:-4)

创建一个将Object映射到Object的hashmap - 然后你可以使用相同的map来存储String - &gt;整数和整数 - &gt;字符串。

添加字符串/ int对时,只需将它们两种方式添加到同一个地图中即可。