我需要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 []中的元素连接成一个字符串 还有更好的方法吗?
提前致谢!
答案 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)作为密钥。