2010-12-10 6 views
1

Ich habe den folgenden Code:Warum hat containsKey den Schlüssel nicht gefunden?

payoffs2exchanges.put(point, exchange); 
if (!payoffs2exchanges.containsKey(point)) { 
    game.log.fine("yes"); 
} else { 
    game.log.fine("no"); 
} 

Es gibt "Nein". Mit anderen Worten, ich füge das Schlüssel-Wert-Paar der Karte hinzu und überprüfe sofort danach, ob der Schlüssel existiert und finde heraus, dass er nicht existiert. Warum?

Ich habe immer noch das Problem mit dem Schlüssel. Der folgende Code besagt, dass jedes Mal, wenn ich einen Schlüssel hinzufüge, ein neuer Schlüssel hinzugefügt wird. Und ich weiß, dass das nicht der Fall ist.

 Integer[] point = new Integer[2]; 
     point[0] = proposerBestScore; 
     point[1] = responderBestScore; 
     game.log.fine("In the getCloudOfPayoffs: found payoffs:" + point[0] + "," + point[1] + ". Exchange: " + exchange[0]+","+exchange[1]+","+exchange[2]+","+exchange[3]+","+exchange[4]); 
     // With the following block we ensure that every options (pair of payoffs) is represented by exchange with minimal number of moves. 
     if (!payoffs2exchanges.containsKey(point)) { 
      payoffs2exchanges.put(point, exchange); 
      game.log.fine("In the getCloudOfPayoffs: this option is new. We add it to the map."); 
     } else { 
      game.log.fine("In the getCloudOfPayoffs: this option is old."); 
      Integer[] exchangeFromMap = payoffs2exchanges.get(point); 
      Integer newSum = 0; 
      Integer oldSum = 0; 
      for (int i=0;i<Design.nColors;i++) { 
       newSum = newSum + Math.abs(exchange[i]); 
       oldSum = oldSum + Math.abs(exchangeFromMap[i]); 
      } 
      if (newSum<oldSum) { 
       game.log.fine("In the getCloudOfPayoffs: the new exchange is better than the old one."); 
       payoffs2exchanges.put(point, exchange); 
      } 
     } 
+0

Welche Klasse ist 'Punkt'? Benutzerdefinierte Klasse? Welche Klasse ist "Auszahlungen2"? –

+0

Eine Antwort zu Ihrem Update hinzugefügt. – aioobe

+0

@aioobe, Entschuldigung für diese Manipulationen mit der Frage. Ich lege es zurück. Also, Sie antworten, ist nützlich. – Roman

Antwort

6

Sie eine Integer[] als Schlüssel in der Karte. Dies ist eine schlechte Sache, da Java-Arrays equals und hashCode nicht wie erwartet implementieren. dieses Beispiel Siehe:

public class Test { 
    public static void main(String[] args) { 
     Integer[] arr1 = { 1, 2 }; 
     Integer[] arr2 = { 1, 2 }; 

     System.out.println(arr1.equals(arr2)); 
     System.out.println(arr1.hashCode() + "/" + arr2.hashCode()); 
    } 
} 

Auf meinem Computer druckt:

false 
1476323068/535746438 

Meine Empfehlung ist, eine benutzerdefinierte Point Klasse zu erstellen, die ordnungsgemäß überschreibt equals und hashCode (oder möglicherweise java.awt.Point wiederverwenden, wenn Sie denken, dass Marken Sinn).

+0

bedeutet es, dass ContainsKey nicht funktioniert, wenn ich Integer-Array als Schlüssel verwende? – Roman

+0

Ja, genau. Karten im Allgemeinen beruhen stark auf der 'equals'-Methode, und wenn es zum Beispiel' HashMap' kommt, ist auch der 'hashCode' wichtig. – aioobe

+0

aber kann ich noch 'somHashMap.get (key) 'if Schlüssel ist ein Integer-Array? – Roman

6

Es ist das Richtige zu tun. containsKey gibt true zurück, der Operator ! negiert es zu false, und so gibt es no aus (die Else-Klausel).

+0

Danke! Es war eine dumme Frage. – Roman

+0

Willkommen. Ich denke, es war ein unvorsichtiger Fehler. – lijie

0

Blick auf den Code :) druckt no, wenn die Karte tatsächlich den Schlüssel enthält, ...

Verwandte Themen