10

我需要以下 Python 的 Java 等效项:

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[]一个String.

有没有更好的办法?

4

3 回答 3

12

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()地确保不变性。

于 2013-11-06T06:01:22.740 回答
5

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

于 2013-11-06T06:01:29.133 回答
1

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

于 2013-11-06T06:05:33.190 回答