java - 使用字符串元组作为HashMap的键

时间:2013-11-06 05:53:42

标签: java hashmap

我需要java等效于以下python

In [1]: d = {}

In [2]: k = ("x","2")

In [3]: d[k] = 1

In [4]: print d[("x","y")]
1

Python有可以清除的元组 我尝试在Java中使用不成功

Map<String[], Integer> d = new HashMap<String[], Integer >();
String[] k = new String[]{"x", "y"};
d.put(k, 1);
System.out.println(d.get(k));
System.out.println(d.get(new String[]{"x", "y"}));

输出

1
null

这意味着对String []的引用将被哈希而不是值。

我能想到的一种低效的方法是将String []中的元素连接成一个字符串 还有更好的方法吗?

提前致谢!

3 个答案:

答案 0 :(得分:7)

HashMaps使用Object.hashCode()来创建哈希。默认情况下,这会使用对每个实例唯一的对象散列 - 但不会查看任何内容。

你想要创建一个覆盖hashCode()的元组,除此之外,它一旦创建就是不可变的:

public class Tuple<T> {
    private final T[] contents;

    public Tuple (T[] contents) {
        if (contents.length != 2)
            throw new IllegalArgumentException();
        this.contents = contents;
    }

    public T[] getContents () {
        return this.contents.clone();
    }

    @Override
    public int hashCode () {
        return Arrays.deepHashCode(this.contents);
    }

    @Override
    public boolean equals (Object other) {
        return Arrays.deepEquals(this.contents, other.getContents());
    }

    @Override
    public String toString () {
        return Arrays.deepToString(this.contents);
    }
}

[编辑]:请注意,如果使用可变对象而不是字符串,则getter必须执行深层复制,而不仅仅是简单的clone()以确保不变性。

答案 1 :(得分:2)

Java中的数组不提供hashCode()equals(Object)方法,因此它们不适合作为映射键。 您可以使用的是Arrays.asList(string1, string1, etc),它会为您提供一个不可变的List,这是Map密钥所需的所有方法。

答案 2 :(得分:1)

您可以使用Arrays.toString(myArray)作为密钥。