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

Nul*_*oet 8 java hashmap

我需要java等效于以下python

In [1]: d = {}

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

In [3]: d[k] = 1

In [4]: print d[("x","y")]
1
Run Code Online (Sandbox Code Playgroud)

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"}));
Run Code Online (Sandbox Code Playgroud)

它输出

1
null
Run Code Online (Sandbox Code Playgroud)

这意味着对String []的引用正在获取哈希值而不是值.

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

提前致谢!

Joh*_* H. 8

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Mur*_*nik 5

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