Comment écrire la méthode hashCode pour une classe en particulier?
Je suis en train de générer un hashCode() la méthode de ma classe mais je ne suis pas aller nulle part avec elle. Je vous serais reconnaissant de toute aide. J'ai implémenté la méthode equals (), qui se présente comme suit, et voudrais aussi savoir si j'ai besoin de mettre en œuvre compareTo() de la méthode. J'ai importés de java.lang.Le caractère à utiliser de caractères.hashCode (), mais il ne semble pas fonctionner.
private class Coord{
private char row;
private char col;
public Coord(char x, char y){
row = x;
col = y;
}
public Coord(){};
public char getX(){
return row;
}
public char getY(){
return col;
}
public boolean equals(Object copy){
if(copy == null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col)
return true;
else
return false;
}
}
}
Merci d'avance...
La comparTo() méthode qui me donne de java.lang.Comparable erreur de casting..
public int compareTo(Object copy){
if(copy==null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col){
return 0;
}
else if(copy2.col < this.col){
return -1;
}
else{
return 1;
}
}
}
merci...
Je pense que Prépondérant equals et hashCode en Java va vous aider.
OriginalL'auteur A Gore | 2013-05-04
Vous devez vous connecter pour publier un commentaire.
À mettre en œuvre hashCode, vous remplacez la valeur par défaut de mise en œuvre de l'Objet:
Ce n'est pas vraiment un idéal de hachage, puisque ses résultats sont très prévisibles et il est facile pour les deux différentes
Coord
objets de retourner la même valeur. Une meilleure hachage d'utiliser le haut-Arrays
classe dejava.util
(http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html):Vous pouvez utiliser cette méthode pour générer un bon de hachage avec un certain nombre de domaines.
À mettre en œuvre compareTo, vous voulez que votre classe pour mettre en œuvre Comparable:
Une fois que vous avez fait cela, vous pouvez faire compareTo prendre un argument de type
Coord
plutôt que de typeObject
, ce qui va vous épargner la peine de vérifier son type.Arrays.hashCode(Object[] args)
qui a été en Java depuis 1.5Bon point, je vais le mettre à jour
J'ai aussi écrit un comparTo() la méthode thatlooks comme
public int compareTo(Object copy){ if(copy==null){ throw new NullPointerException("Object entered is empty"); } else if(copy.getClass()!=this.getClass()){ throw new IllegalArgumentException("Object entered is not Coord"); } else{ Coord copy2 = (Coord)copy; if(copy2.row==this.row && copy2.col==this.col){ return 0; } else if(copy2.col < this.col){ return -1; } else{ return 1; } } }
Mais je reçois Coord ne peut pas être lancé à java.lang.Comparables. Pourrais-je savoir pourquoi?Vous devriez demander que, dans une question distincte.
Désolé à ce sujet. J'ai édité ma question et y a ajouté du contenu supplémentaire ici. Je ne sais pas si deux postes pour la question similaire serait souhaitable!!
OriginalL'auteur nullptr
Hashcode est un
int
(32 bits), vos données sontchar
(16 bits), donc je serais probablement juste de ne:Cela met les bits de
row
dans le premier 16 bits et les bits decol
dans le dernier 16 bits, donc c'est un parfait fonction de hachage pour cette classe.Si vous refactoriser votre classe afin d'être plus compliqué, je vous recommande d'utiliser nullptr de réponse.
À utiliser
Comparable
, n':Yep. "Assez rare" est de sous-estimer. C'est en fait une fonction de hachage parfait pour une paire de caractères; deux objets ont le même code de hachage si, et seulement si, ils représentent des valeurs égales.
Eh bien, rappelez-vous, un
HashMap
utilise le module sur lahashCode()
valeur, il ne contient pas de 2^32 possible cellules. Donc, pour certains caractères et moduluses etHashMap
tailles, il y aura toujours des collisions. Cependant, je suis d'accord, je pourrais avoir formulé mieux 🙂J'ai changé le texte pour être plus précis 😉
OriginalL'auteur durron597
J'ai trouvé des informations très précieuses sur ce sujet et sur bien d'autres sujets dans le Efficace Java livre, écrit par Joshua Bloch. Regardez la page 45 pour plus d'informations sur hashCode() et equals().
Si vous utilisez un IDE comme Eclipse, vous pouvez laisser générer la
hashCode()
etequals()
méthodes. Pour votre classe, le résultat serait:32*hash+offset
qui dispose de 5 moins de bits d'entropie que votre source de hachage. Pas l'idéal.OriginalL'auteur Matthias Herlitzius
similaire à durron597 réponse, vous pouvez essayer si votre entrée est délimitée par char (entre 0 et 65535 )
OriginalL'auteur Peeyush