我正在尝试在java中创建一个哈希表,其中键是int [],但它不起作用。我做了一个小测试程序来显示我的问题:
public class test{
public static void main(String[] args){
int[] test0 = {1,1};
int[] test1 = {1,1};
Hashtable<int[], String> ht = new Hashtable<int[], String>();
String s0 = "foo";
ht.put(test0, s0);
System.out.println("the result from ht.get(test1)");
System.out.println(ht.get(test1));
System.out.println("the result from ht.get(test0)");
System.out.println(ht.get(test0));
}
}
我的意图是两个ht.get calles应返回相同的结果,因为两个数组相等,但它们不相同。以下是运行代码的结果:
the result from ht.get(test1)
null
the result from ht.get(test0)
foo
我在这里遗漏了什么,或者只是不可能将int []用作hastable中的键?
答案 0 :(得分:16)
您可以使用int []作为键,但它必须是相同的数组,而不仅仅是具有相同的内容。 (这意味着它不会做你想要的)
如果数组是相同的数组,则数组不是equals()或基于它们的内容具有相同的hashCode()。
你能做到这一点的唯一方法是使用List&lt; Integer&gt;作为int []的键或包装器,例如TIntArrayList。
尝试以下方法。
List<Integer> test0 = Arrays.asList(1,1);
List<Integer> test1 = Arrays.asList(1,1);
Map<List<Integer>, String> ht = new HashMap<List<Integer>, String>();
BTW:Hashtable是遗留类恕我直言,除非必须,否则不要使用它。
答案 1 :(得分:0)
除了在List中包装
之外,您可以在散列之前从数组中创建字符串(除非数组的长度过长)如果您选择后者,则此处描述的Arrays
静态方法 From java static Arrays class at http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#toString(int[])
h1.put(Arrays.toString(test1), s0);
现在你可以对此进行散列,并且等效数组将散列为相同的东西。但是,您将无法从密钥重新创建数组(除非Java现在有某种eval
?)
。
。
。
。
为了好奇,这是我愚蠢地滚动自己直到找到上述方法:
public String intArrayToString(int[] x)
{
String ans = '[';
for(i = 0; i < size(x); i++)
ans += '' + i + ',';
return ans + ']';
}
HashTable<String,String> h1 = new HashTable<String,String> h1;
h1.put(intArrayToString(test1), s0);
如果有某种静态toString这样做,我道歉。 PS - Java是否已经减少了函数(和lambdas),foreach循环或eval(如果需要,还可以将键重建为数组)?他们会使这个解决方案更好......
答案 2 :(得分:0)
根本原因是数组 test0 且 test1 具有不同的hashCodes 。如果2个密钥具有不同的哈希码,则它们永远不会相同。