繁体   English   中英

如何在java中创建2路地图

[英]How to create a 2 way map in java

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

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

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

看起来您可能正在寻找双图。

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

BiMap文档:

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

BiMap.inverse方法自然会返回一个Map与值作为键和键作为值,使Map可以用来打电话get的价值和检索的关键。

另外inverse返回的Map是底层数据的视图,所以不需要对原始数据做额外的拷贝。

BiMap.inverse方法文档:

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

你可以做一个像这样的简单实现。 请注意,在此实现中不会复制数据。 仅供参考! 我已经添加了添加和获取的实现。 删除和其他必需的方法留作练习:)

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

Apache Commons 还包括BidiMap (双向地图)。

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

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

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

使用番石榴

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

在这里阅读完整的教程

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

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

创建一个将对象映射到对象的哈希图 - 然后您可以使用相同的映射来存储字符串 -> 整数和整数 -> 字符串。

当您添加一个字符串/整数对时,只需将其以两种方式添加到同一个地图中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM