2011-01-08 91 views
7

我想在java中的鍵是int [],但它不起作用的哈希表。我做了一個小測試程序,以顯示我的問題:用int數組作爲鍵的哈希表在java中

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卡列斯應該返回相同的結果,因爲這兩個數組是相等的,但他們不。下面是從運行代碼的結果:

the result from ht.get(test1) 
null 
the result from ht.get(test0) 
foo 

我失去了一些東西在這裏,或只是無法使用int []作爲在hastable鑰匙?

回答

14

您可以使用int []作爲重點,但它必須是在同一個陣列,而不僅僅是具有相同的內容。 (這意味着它不會做你想要的)

數組不是equals()方法或者基於其上,如果它們是相同的陣列內容相同的hashCode()。

你能做到這一點的唯一方法是使用一個列表<整數>鍵或包裝你的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>(); 

順便說一句:Hashtable是一個遺留類恕我直言,除非必須使用它。

+4

+1完美答案 – 2011-01-08 09:28:54

+3

列表(通常)也是可變的。最重要的區別是[`List.equals`](http://download.oracle.com/javase/6/docs/api/java/util/List.html#equals%28java.lang.Object%29)和[`List.hashCode`](http://download.oracle.com/javase/6/docs/api/java/util/List.html#hashCode%28%29)需要使用元素相等。 – 2011-01-08 09:30:52

0

您可以哈希之前創建的字符串出陣列(除非數組的長度比登天長)除了在列表包裝

你應該選擇後者有這裏所描述的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現在呢?)




對於curiousities的緣故,這裏是我的愚蠢我自己的滾動,直到我發現上面的方法:

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(如果需要重建鍵到數組)?他們會做出這種解決方案更好...

0

根本原因是陣列TEST0test1的不同的哈希碼。如果2個密鑰具有不同的哈希碼,它們永遠不會相同。