2011-01-08 10 views
7

Ich versuche eine Hashtabelle in Java zu machen, wo die Schlüssel int [] sind, aber es funktioniert nicht. Ich habe ein kleines Testprogramm gemacht, mein Problem zu zeigen:Hashtable mit int-Array als Schlüssel in 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)); 
     } 
} 

Meine Absicht ist es, dass beide ht.get Calles sollten das gleiche Ergebnis zurück, da die beiden Arrays gleich sind, aber sie nicht. Hier ist das Ergebnis von Ausführung des Codes:

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

Fehle ich etwas hier, oder ist es einfach unmöglich verwenden int [] als Schlüssel in einem hastable?

Antwort

14

Sie können int [] als Schlüssel verwenden, aber es muss das gleiche Array sein, nicht nur den gleichen Inhalt. (Was bedeutet, dass es nicht das tut, was Sie wollen)

Arrays sind nicht gleich() oder haben den gleichen HashCode() basierend auf ihrem Inhalt auf, wenn sie das gleiche Array sind.

Die einzige Möglichkeit, dies zu tun, ist eine Liste < Integer> als Schlüssel oder Wrapper für Ihre int [] z. TntArrayList.

versuchen Sie Folgendes.

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 ist eine Legacy-Klasse IMHO, verwenden Sie es nicht, es sei denn Sie müssen.

+4

+1 perfekte Antwort –

+3

Listen sind (normalerweise) auch veränderbar. Der wichtige Unterschied ist, dass ['List.equals'] (http://download.oracle.com/javase/6/docs/api/java/util/List.html#equals%28java.lang.Object%29) und ['List.hashCode'] (http://download.oracle.com/javase/6/docs/api/java/util/List.html#hashCode%28%29) wird benötigt, um elementweise Gleichheit zu verwenden. –

+0

@Matthew, guter Punkt.Die Erwähnung der Veränderlichkeit wurde gestrichen. –

0

Sie Strings aus dem Arrays vor Hashing (es sei denn, die Länge des Arrays untragbar lang ist) zusätzlich zur Verpackung in einer Liste

Sollten Sie letztere gibt es eine statische Methode Arrays hier beschrieben erstellen 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); 

Jetzt können Sie diese Hash und äquivalente Anordnungen auf derselben Hash werden. Sie können das Array jedoch nicht aus dem Schlüssel neu erstellen (es sei denn, Java hat eine Art von eval jetzt?)

.
.
.
.

Für Kuriositäten willen, hier ist ich meine eigenen dummerweise rollen, bis ich das obige Verfahren gefunden:

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

Wenn es irgendeine Art von statischem toString ist, das dies tut Ich entschuldige mich. PS - hat Java noch Funktionen (und lambdas), foreach-Schleifen oder eval (zum Rekonstruieren von Schlüsseln in Array, wenn nötig) noch reduziert? Sie würde diese Lösung schöner ...

+0

Ja, es gibt die statische Methode 'Arrays.toString'. Entschuldigung akzeptiert, Kapitän jon_darkstar. –

+0

hah, du schlägst mich leicht dazu = P –

+0

Die Arrays in Strings zu verwandeln war auch die Lösung, dass ich an mich selbst gedacht hatte, aber ich mochte den Gedanken des unnötigen Overheads nicht, die Strings immer dann zu erstellen, wenn ich auf etwas zugreifen musste Die Hashtabelle –

0

Ursachen ist Array TEST0 und test1 haben verschiedene Hashcodes. Wenn zwei Schlüssel unterschiedliche Hashcodes haben, können sie niemals gleich sein.

Verwandte Themen