带有多个键的Java Map

时间:2014-09-29 22:34:36

标签: java dictionary hashmap

我需要创建一个包含3列的地图:2个键和1个值。因此每个值将包含2个不同类型的键,并且可以使用任何一个来获取。但我的问题是HashMap / Map只支持1个键和1个值。有没有办法创建类似Map<Key1, Key2, Value>而不是Map<Key, Value>的内容?因此可以使用ValueKey1来获取Key2

如果它是重复或错误的问题,我道歉,但我在Stack Overflow上找不到类似的问题。

P.S:我不想创建2个地图:Map<Key1, Value>Map<Key2, Value>也不创建嵌套地图我正在寻找一个多关键表,就像上面那样。

5 个答案:

答案 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)

答案 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>>