Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
Sobreescritura del equals
class Punto2D{
private int x;
private int y;
private String nombre;
public Punto2D(int x, int y, String nombre) {
super();
this.x = x;
this.y = y;
this.nombre=nombre;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Punto2D)) return false;
Punto2D punto = (Punto2D) o;
return (x == punto.x) && (y == punto.y);
}
}
Ejercicio
Hacer una clase llamada Deposito que tiene un nombre, un largo, un ancho y un alto.
Hacer un método equals (y su correspondiente) que devolverá true cuando dos depósitos tengan el mismo volumen (largo*ancho*alto).
Sobreescritura del hashcode
Este método sirve para comparar objetos dentro de una estructura de tipo Hash (HashMap, HashSet, etc.). Su reescritura no es indispensable, pero sí recomendable.
El método hashCode() devuelve un dato de tipo int que identifica al objeto. Dicho entero debería estar en función de valores que determinen cuando un objeto es igual o distinto de otro, en el caso de una finca largo y ancho.
Es más rápido que el método equals. Cuando comparamos dos objetos…
- Si no tienen el mismo hashcode, son diferentes.
- Si tienen el mismo hashcode, se llamará al método equals.
Sobreescritura del hashcode (JDK 7)
public int hashCode() {
return Objects.hash(x, y);
}
Sobreescritura del compareTo
El método compareTo determina si un objeto es mayor, menor o igual a otro. Devuelve 0 si son iguales, 1 (o un entero positivo cualquiera) si el primero es mayor q el segundo y -1 (o un número negativo cualquiera) si el segundo es mayor que el primero
Finca.java
public class Finca implements Comparable<Finca>{
...
public int compareTo(Finca otherFinca){
double productoThis = this.getAncho()*this.getLargo();
double productoOther = otherFinca.getAncho()*otherFinca.getLargo();
int valorDevuelto = 0;
if(productoThis > productoOther)valorDevuelto=1;
if(productoThis < productoOther)valorDevuelto=-1;
if(productoThis == productoOther)valorDevuelto=0;
return valorDevuelto;
}
Main.java
Collections.sort(lista); //Para que esto funcione es necesario implementar la interfaz comparable
Iterator<Finca> it = lista.iterator();
while(it.hasNext()){
Finca c = it.next();
System.out.println(c.getNombre());
}
Notas
- Todos los objetos tienen el método equals(), pero no todos tienen el método compareTo().
- Si sobreescribo el compareTo, debería sobreescribir el equals. Si sobreescribo el equals, debo sobreescribir el hashcode.
Ejercicio – equals y compareTo
- Hacer una clase llamada Deposito que tiene un nombre, un largo, un ancho y un alto.
- Dentro de la clase Depósito, definir un método equals (y su correspondiente método hashcode) que devolverá true cuando dos depósitos tengan el mismo volumen (largo*ancho*alto).
- Crear 5 depósitos.
- Añadirlos a una lista.
- Ordenar la lista.
- Recorrerla con un iterator.
- Comprobar que los depósitos están ordenados por su volumen. Para ello tendremos que haber sobreescrito el método compareTo