如何在java中创建双向映射

如何在java中创建双向映射,java,data-structures,Java,Data Structures,我需要一个数据结构来以1:1的关系存储字符串int值对,并且也能够从任何一种方式查找对应的字符串int值对 我编写了一个包含哈希表和字符串数组的类,将数据存储了2次,并使用内置函数进行查找 我的问题是,有没有更好的方法来实现这一点?“更好”是指效率更高,不需要存储数据两次,最好也不需要编写大量代码:P.有一个可以满足您需要的程序。看起来您可能正在寻找一个bimap Google Collections(现在是的一部分)包含一个带有一些实现的接口 从BiMap文档中: bimap(或“双向映射”)

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

我编写了一个包含哈希表和字符串数组的类,将数据存储了2次,并使用内置函数进行查找


我的问题是,有没有更好的方法来实现这一点?“更好”是指效率更高,不需要存储数据两次,最好也不需要编写大量代码:P.

有一个可以满足您需要的程序。

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

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

BiMap
文档中:

bimap(或“双向映射”)是一种 保持地图唯一性的地图 它的价值观以及它的 钥匙。此约束启用BIMAP 支持“反向视图”,即 另一个包含相同内容的bimap 条目作为此bimap,但带有 反转键和值

该方法似乎返回一个
Map
,其中值作为键,键作为值,因此
Map
可用于调用值上的
get
,并检索键

此外,
inverse
返回的
Map
是基础数据的视图,因此它不必对原始数据进行额外的复制

BiMap.inverse
方法文档中:

返回此对象的反向视图 bimap,映射每个bimap的 将值添加到其关联的键。两个 BIMAP由相同的数据支持; 对其中一项的任何更改都将显示在 其他的


创建一个将对象映射到对象的hashmap,然后您可以使用相同的映射来存储String->Integer和Integer->String


添加字符串/int对时,只需将其以两种方式添加到同一映射。

您可以这样做一个简单的实现。请注意,此实现中不会复制数据。只有参考文献才是!我已经为add和get添加了实现。移除和其他所需方法保留为练习:)

公共类双向hashmap{
私有映射转发=新哈希表();
私有映射向后=新哈希表();
公共同步作废添加(K键,V值){
提出(关键、价值);
向后放置(值、键);
}
公共同步V getForward(K键){
返回前进。获取(键);
}
公共同步K getBackward(V键){
返回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"));
TwoWayHashmap twmap=新TwoWayHashmap();
添加(“aaa”、“bbb”);
添加(“xxx”、“yyy”);
System.out.println(twmap.getForward(“xxx”);
System.out.println(twmap.getBackward(“bbb”);

Apache Commons还包括(双向地图)

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

此扩展映射表示键可以在其中查找值的映射 值可以同样轻松地查找键。此接口扩展了 地图,因此可用于任何需要地图的地方。接口 提供反向地图视图,可完全访问两个方向 比迪马普的

使用

HashBiMap-map=HashBiMap.create();
地图。放置(“名称”、“Sohail”);
地图放置(“国家”、“巴基斯坦”);
Log.d(“tag”,“name is”+map.get(“name”));
BiMapinvmap=map.inverse();
Log.d(“tag”,“巴基斯坦是一个”+invmap.get(“巴基斯坦”);
阅读完整的教程

绝对不需要编写大量代码→ 以λ为单位
地图中
可以通过

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

没错,就是这样!通过搜索“双向映射”,我找不到任何东西:P似乎双向映射是正确的术语,答案中的javadoc链接不再起作用。替换:这根本不是一个非常明智的实现。您将所有泛型类型安全性抛出窗口,并通过双重添加条目增加在映射上执行的所有操作的复杂性。没有封装实现双向映射所用的机制。@Tom-我匆忙地写下了答案,并假设实现者会明智地将hashmap封装在一个类中,该类控制对它的访问,并对所需类型进行转换。我将在将来更清楚地说明这一点。您可能遇到的另一个问题是存储A->B和B->C,这对问题应该是好的,但对您的答案来说不是。如果没有番石榴的BiMap,这将是一个有趣的方法。但是,我建议您让这个类实现Map接口。如果您需要带有Map接口的类,您可以用Map inverse()替换getBackward方法,这将返回反向Map。请参阅这个简单的答案答案答案答案答案中可能重复的Javadoc链接不再有效。替换:
    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"));
Map<Integer,String> inverted = map.keySet().stream().collect(
    toMap( s -> map.get( s ), s -> s ) );