2011-01-08 9 views
7

私はキーがint []であるjavaでハッシュテーブルを作ろうとしていますが、それはうまくいきません。私は私の問題を示すために、少しテストプログラムを作っていますjavaのキーとしてint配列を持つHas​​htable

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)); 
     } 
} 

私の意図は、2つの配列が同等であるが、彼らはいけないので、両方のht.get callesは、同じ結果を返すべきであるということです。ここでの結果は、コードを実行しているからである:

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

は、私がここで何かをしないのですか、それはhastableのキーとしてのint []を使用するだけでは不可能でしょうか?

答えて

14

キーとしてint []を使用できますが、同じ内容でなく、同じ配列でなければなりません。

配列はequals()ではないか、同じ配列の場合は内容に基づいて同じhashCode()を持ちます。

これを行うには、リスト< Integerをキーとして使用するか、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:ハッシュテーブルは、従来のクラスのIMHOです。必要がない限り、使用しないでください。 (配列の長さが極端に長い場合を除き)あなたがリストにラッピングに加えて、ハッシュ前に配列のうち、

を文字列を作成することができます

+4

+1完全回答 –

+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)は、要素ごとの等価性を使用する必要があります。 –

+0

@Matthew、良い点。変更可能性の言及を削除しました。 –

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の何かを持っていない限り)




。私は謝罪これを行う静的のtoStringのいくつかの種類がある場合は

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); 

:私は上記の方法を見つけるまでcuriousitiesの便宜上

は、ここで私は愚かな自分自身をロールです。 PS - Javaは関数(およびラムダ)、foreachループ、またはeval(必要に応じてキーを配列に再構築するため)をまだ減らしていませんか?彼らは

+0

はい、 'Arrays.toString'静的メソッドがあります。受け入れられた謝罪、キャプテンjon_darkstar。 –

+0

あなたはそれを少し叩いてくれました= P –

+0

配列を文字列に変換することも私の自己を考えていた解決策でしたが、何かにアクセスしなければならないたびに文字列を作成するという不慣れなオーバーヘッドの考えが気に入らなかったハッシュテーブル –

0

根本原因は、アレイTEST0test1の異なるハッシュコードを持っている...このソリューションはよりよいになるだろう。 2つのキーが異なるハッシュコードを持つ場合、決して同じではありません。

関連する問題