我需要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 []中的元素连接成一个字符串.
有没有更好的办法?
提前致谢!
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()确保不变性的简单.
Java 中的数组不提供hashCode()和equals(Object)方法,因此它们不适合作为映射键。您可以使用 whichArrays.asList(string1, string1, etc)为您提供一个 immutable ,其中包含 a的密钥List所需的所有方法。Map