你能否建议一种地图或类似的数据结构,我们可以同样轻松地获得彼此的价值和关键。也就是说,每个都可以用来寻找其他。
答案 0 :(得分:35)
Java在其标准库中没有双向映射。
答案 1 :(得分:19)
如果您觉得导入某些第三方库很痛苦。 这个简单的课怎么样?
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);
}
}
确保K和V类具有正确的hashCode实现。
答案 2 :(得分:12)
最常见的解决方案是使用两张地图。通过扩展AbstractMap
,您可以轻松地将它们封装在具有友好界面的类中。 (更新:这就是Guava HashBiMap
的实施方式:两张地图)
使用除数组和自定义类之外的任何内容创建新数据结构几乎没有什么优势。映射实现是索引键的数据结构的轻量级包装器。由于您需要两个索引,因此您可以使用两个完整的映射。
答案 3 :(得分:7)
还可以尝试Apache Commons Collections 4 BidiMap Package。
答案 4 :(得分:5)
Google Guava包含BiMap
(双向地图)。
答案 5 :(得分:1)
对于需要像这样的字典的普通用例,我认为KISS解决方案没有任何问题,只需将密钥和值反之亦然,只为此目的节省第二个Map或甚至库的开销:
myMap.put("apple", "Apfel");
myMap.put("Apfel", "apple");
答案 6 :(得分:1)
基于本次质量检查中的this answer及其后的评论。 [将接受测试]
双向地图
import java.util.HashMap;
public class BidirectionalMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
public HashMap<V, K> inversedMap = new HashMap<V, K>();
public K getKey(V value) {
return inversedMap.get(value);
}
@Override
public int size() {
return this.size();
}
@Override
public boolean isEmpty() {
return this.size() > 0;
}
@Override
public V remove(Object key) {
V val=super.remove(key);
inversedMap.remove(val);
return val;
}
@Override
public V get(Object key) {
return super.get(key);
}
@Override
public V put(K key, V value) {
inversedMap.put(value, key);
return super.put(key, value);
}
}
答案 7 :(得分:0)
您可以定义一个枚举并定义帮助程序方法以获取密钥。性能是路太远好于BidiMap。 例如
public enum Fruit {
APPLE("_apple");
private final String value;
Fruit(String value){
this.value=value;
}
public String getValue(){
return this.value;
}
public static String getKey(String value){
Fruit fruits[] = Fruit.values();
for(Fruit fruit : fruits){
if(value.equals(fruit.value)){
return fruit.name();
}
}
return null; }
}