Pourquoi cette table de hachage.obtenez de retour null?
Je suis en train de créer un Hashmap
pour effectuer une recherche pour moi. Cependant lorsque j'exécute ce code de test, la sortie est nulle. Je pense que c'est à cause de la nature de la façon dont les clés sont stockées, mais je ne suis pas positif. Peut-être que c'est la même chose pour eux, comme la façon dont le var1 == var2
ne sont pas égaux, à moins qu'ils pointent vers le même Objet en mémoire, au lieu de cela, vous devez utiliser le var1.equals(var2)
?
Il y a deux classes pour tester cela.
TestCard.java
import java.util.HashMap;
public class TestCard {
//HashMap for SpecialK Lookup
private static HashMap<Card, Integer> specialKLookup = new HashMap<Card, Integer>();
//Constructor
public TestCard(){
}
public static void main(String[] args) {
Card[] cards = new Card[3];
cards[0] = new Card((short)12, (short)0);
cards[1] = new Card((short)0, (short)1);
cards[2] = new Card((short)5, (short)2);
/* Build SpecialK Lookup HashMap.
* Ace of Spades = 0
* Ace of Hearts = 1
* Ace of Diamonds = 2
* Ace of Clubs = 3
* ...
* Two of Clubs = 51
*/
Integer specialKCounter = 0;
for(int i=12;i>=0;i--){
for (int j=0;j<4;j++){
specialKLookup.put(new Card((short)i, (short)j), specialKCounter++);
}
}
System.out.println(specialKLookup.get(cards[0]));
}
}
Card.java
public class Card{
private short rank, suit;
private static String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
private static String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
//Constructor
public Card(short rank, short suit){
this.rank = rank;
this.suit = suit;
}
//Getter and Setters
public short getSuit(){
return suit;
}
public short getRank(){
return rank;
}
protected void setSuit(short suit){
this.suit = suit;
}
protected void setRank(short rank){
this.rank = rank;
}
}
Vous devez vous connecter pour publier un commentaire.
La classe (
Card
) manque une bonne mise en œuvre deequals(Object)
ethashCode()
Sans ces deux définie sera tout simplement pas de travail. (Il compile bien parce que ces méthodes sont à la fois virtuel et a hérité de tous les objets tels qu'ils sont une partie de l'Objet: table de hachage ne peut pas appliquer cela au moment de la compilation.) Voir les liens ci-dessus pour le contrat qui est nécessaire.
Ces deux méthodes sont nécessaires pour être mis en œuvre parce que
hashCode
détermine la valeur de hachage-seau utilisé dans la table de hachage de la mise en œuvre etequals
est de s'assurer qu'un objet de valeur est égal à (plusieurs objets peuvent avoir la mêmehashCode
, c'est pourquoiequals
est également requise). Voir Table de hachage pour plus d'général de hachage de détails.Si ces méthodes ne sont pas surchargés puis la mise en œuvre définies dans l'Objet sont utilisés. C'est,
x.equals(y)
a près-x == y
de la sémantique et dehashCode
renvoie un nombre stable par contrat. Cela permet à la carte de travail comme un carte d'identité (lorsque la Carte les objets sont les clés): seulement exactement le même objet pouvez récupérer un déjà à valeur stockée, tous les autres seront de retour nulle, comme l'a observé.Heureux de codage.
Il est en effet exactement la raison de ce problème.
Vous devez définir ce que l'égalité des sexes sur les cartes, de sorte que vous devez remplacer la
equals
ethashCode
méthodes.Si vous ne le faites pas, il suppose que les deux cartes ne sont égales si elles sont de la même instance. (Comme dans le comportement par défaut de
equals
.)Noter qu'il est très important de remplacer les deux
equals
ethashCode
, comme deux objets sont égaux doit de hachage pour la même valeur pour unHashMap
pour fonctionner correctement.Pour plus d'informations, voir Primordial equals et hashCode en Java.
Presque. Comme vous vous en doutiez, un de hachage de la carte a besoin d'un moyen d'obtenir des codes de hachage pour vos objets. En Java, c'est fourni par le la méthode hashCode qui est mis en œuvre par l'Objet, mais il doit être remplacé par votre Carte de classe.
*mise à jour: pst points, il faut aussi remettre sur pied égal à égal.
equals
, par le contrat.Vous avez besoin pour mettre en œuvre le hashCode et equals méthodes, car cela permet une égalité d'essais sur deux objets différents, et contribue aussi à hachage de la carte de stockage. Sans la mise en œuvre de ces deux objets seront considérés comme distincts, même si leurs propriétés sont les mêmes. Voir http://www.jchq.net/certkey/0902certkey.htm pour plus de détails.
Carte doit l'emporter sur les
equals
ethashCode
.Jetez un oeil ici: http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html
Vous aurez à remplacer les
hashCode()
méthode pourCard
et faire retourner la même valeur si et seulement si les cartes sont identiques, - vous devez remplacerequals()
trop. Parce que c'est ce que l'HashMap
s'appuie sur afin de trouver les objets référencés par les touches; comme il est maintenant, ce sont les versions de ces méthodes héritées deObject
qui sont utilisés, ce qui ne correspond si vous utilisez les mêmes objets comme des clés, alors que vous êtes en train de créer de nouvelles, mais "égales", ceux.equals()
renvoie la valeur true, lahashCode()
doit être le même. Siequals()
renvoie la valeur false, le résultat dehashCode()
encore peut être égal, mais peuvent également différer. Si le résultat dehashCode()
diffère,equals()
doit retourner false.