我需要创建一个包含3列的地图:2个键和1个值。因此每个值将包含2个不同类型的键,并且可以使用任何一个来获取。但我的问题是HashMap / Map只支持1个键和1个值。有没有办法创建类似Map<Key1, Key2, Value>
而不是Map<Key, Value>
的内容?因此可以使用Value
或Key1
来获取Key2
。
如果它是重复或错误的问题,我道歉,但我在Stack Overflow上找不到类似的问题。
P.S:我不想创建2个地图:Map<Key1, Value>
和Map<Key2, Value>
也不创建嵌套地图我正在寻找一个多关键表,就像上面那样。
答案 0 :(得分:2)
您可能不得不编写类似地图的类的自定义实现来实现它。我同意上面的@William Price,最简单的实现是简单地封装两个Map实例。小心使用Map接口,因为它们依赖于equals()和hashCode()来获取密钥标识,您打算在合同中将其中断。
答案 1 :(得分:2)
自己写出符合要求的课程:
import java.util.HashMap;
import java.util.Map;
public class MMap<Key, OtherKey, Value> {
private final Map<Key, Value> map = new HashMap<>();
private final Map<OtherKey, Value> otherMap = new HashMap<>();
public void put(Key key, OtherKey otherKey, Value value) {
if (key != null) { // you can change this, if you want accept null.
map.put(key, value);
}
if (otherKey != null) {
otherMap.put(otherKey, value);
}
}
public Value get(Key key, OtherKey otherKey) {
if (map.containsKey(key) && otherMap.containsKey(otherKey)) {
if (map.get(key).equals(otherMap.get(otherKey))) {
return map.get(key);
} else {
throw new AssertionError("Collision. Implement your logic.");
}
} else if (map.containsKey(key)) {
return map.get(key);
} else if (otherMap.containsKey(otherKey)) {
return otherMap.get(otherKey);
} else {
return null; // or some optional.
}
}
public Value getByKey(Key key) {
return get(key, null);
}
public Value getByOtherKey(OtherKey otherKey) {
return get(null, otherKey);
}
}
答案 2 :(得分:1)
只需存储两次值:
Map<Object, Value> map = new HashMap<>();
map.put(key1, someValue);
map.put(key2, someValue);
问题是,密钥的类型并不重要,因此使用允许两种密钥类型的通用边界 - Object
都可以。
请注意,Map#get()
方法的参数类型无论如何都只是Object
,因此从查找角度来看,使用单独的地图没有任何价值(密钥的类型仅与{{}相关3}})。
答案 3 :(得分:0)
您是否查看过Apache Commons Collection多地图界面? https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html
答案 4 :(得分:0)
看一下可以在你的上下文中使用的guava的Table集合
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Table.html
Table<String,String,String> ==> Map<String,Map<String,String>>