example - java set hashcode
¿Cómo escribir el método hashCode para una clase en particular? (4)
Estoy tratando de generar un método hashCode () para mi clase simple pero no consigo llegar a ningún lado con él. Apreciaría cualquier ayuda. He implementado el método equals (), que se ve de la siguiente manera, y también me gustaría saber si necesito implementar el método compareTo (). He importado java.lang.Character para usar character.hashCode () pero no parece funcionar.
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;
}
}
}
Gracias por adelantado...
El método comparTo () que me está dando java.lang.Comparable error de conversión ...
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;
}
}
}
Gracias...
Encontré información muy valiosa sobre este tema y muchos otros temas en el libro Effective Java, escrito por Joshua Bloch . Consulte la página 45 para obtener más información sobre hashCode () y equals ().
Si usa un IDE como Eclipse, puede dejar que genere los hashCode()
y equals()
. Para tu clase el resultado sería:
class Coord implements Comparable<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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + col;
result = prime * result + row;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Coord other = (Coord) obj;
if (col != other.col)
return false;
if (row != other.row)
return false;
return true;
}
public int compareTo(Coord param) {
// Implementation according to http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
return 0;
}
}
Hashcode es un int
(32 bits), sus datos son char
(16 bits), así que probablemente lo haría:
@Override
public int hashCode() {
return (row << 16) + col;
}
Esto coloca los bits de la row
en los primeros 16 bits y los bits de la col
en los últimos 16 bits, por lo que esta es una función hash perfecta para esta clase.
Si refactoriza su clase para que sea más complicado, recomiendo usar la respuesta de nullptr.
Para usar Comparable
, haz:
public class Coord implements Comparable<Coord>
Para implementar hashCode, anula la implementación predeterminada de Object:
@Override
public int hashCode()
{
return row ^ col;
}
Este no es realmente un hash ideal, ya que sus resultados son muy predecibles y es fácil que dos objetos Coord
diferentes devuelvan el mismo valor. Un mejor hash haría uso de la clase de Arrays
incorporada de java.util
( http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html ):
@Override
public int hashCode()
{
return Arrays.hashCode(new Object[]{new Character(row), new Character(col)});
}
Puedes usar este método para generar un hash bastante bueno con cualquier número de campos.
Para implementar compareTo, querrá que su clase implemente Comparable :
public class Coord implements Comparable<Coord>
Una vez que haya hecho esto, puede hacer una comparación para tomar un argumento de tipo Coord
lugar de tipo Object
, lo que le ahorrará la molestia de verificar su tipo.
similar a la respuesta de durron597, puedes intentar esto si tu entrada está limitada por char (entre 0 y 65535)
public int hashCode(){
return row * 100000 + col;
}