Hashtable使用int数组作为java中的键

时间:2011-01-08 09:20:56

标签: java hashtable int

我正在尝试在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中的键?

3 个答案:

答案 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个密钥具有不同的哈希码,则它们永远不会相同。