Hola a todos, hoy os explicare como comparar objetos de nuestras clases en Java.
Por defecto, al crear un objeto tenemos un método llamado equals que viene de la clase java.lang.Object (es heredada por defecto de todas las clases que creamos).
Cuando comparamos dos objectos, por este método heredado, determina si la dirección de los objetos es igual. Por ejemplo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class EmpleadoApp { public static void main(String[] args) { //Creamos dos objetos distintos Empleado empleado1=new Empleado(); Empleado empleado2=new Empleado(); //Comprobamos si son iguales (no lo son) if (empleado1.equals(empleado2)){ System.out.println("Los objetos son iguales"); }else{ System.out.println("Los objetos no son iguales"); } //Creamos un objeto nuevo Empleado empleado3; //Asignamos la direccion del empleado1 al empleado3 empleado3=empleado1; //Comprobamos si son iguales (si lo son) if (empleado3.equals(empleado1)){ System.out.println("Los objetos son iguales"); }else{ System.out.println("Los objetos no son iguales"); } } } |
¿Podríamos definir nosotros este método indicando que se debe cumplir para que sean iguales? La respuesta es sí, podemos sobrescribir este método, como ya vimos en su momento. La definición del método es:
public boolean equals (objeto_clase a)
Supongamos que para que un empleado sea igual que otro tenga el nombre y apellido igual. Veamos como se implementaría el método equals en la clase Empleado.
|
1 2 3 4 5 6 7 8 |
public boolean equals (Empleado a){ if(a.getNombre().equals(nombre) && a.getApellido().equals(apellido)){ return true; }else{ return false; } } |
Ahora comprobamos que funciona el método.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class EmpleadoApp { public static void main(String[] args) { //Creamos dos objetos distintos Empleado empleado1=new Empleado("Fernando", "Ureña", 23, 600); Empleado empleado2=new Empleado("Antonio", "Lopez", 28, 900); //Comprobamos si son iguales (no lo son) if (empleado1.equals(empleado2)){ System.out.println("Los objetos son iguales"); }else{ System.out.println("Los objetos no son iguales"); } //Creamos un objeto nuevo Empleado empleado3=new Empleado("Fernando", "Ureña", 42, 100); //Comprobamos si son iguales (si lo son) if (empleado3.equals(empleado1)){ System.out.println("Los objetos son iguales"); }else{ System.out.println("Los objetos no son iguales"); } } } |
Hasta ahora, hemos visto que debemos hacer para que comprobar que dos objetos sean iguales.
También podemos indicar si un objeto es mayor o menor que otro, por ejemplo, si un empleado tiene mas años que otro, indicaremos que es mayor.
Para ello usaremos el método compareTo (es parecido al método de String de Java), implementaremos la interfaz Comparable. Veamos como se hace:
|
1 |
public class Empleado implements Comparable |
Como vemos, usamos
Ahora nos obligara a implementar el método compareTo, esta es su definición:
|
1 |
public int compareTo (objeto_clase a) |
Implementaremos el método según como queramos determinar que un objeto es mayor que otro. Así queda:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public int compareTo(Empleado a){ int estado=-1; if(this.edad==a.getEdad()){ //Los objetos son iguales estado=0; }else if(this.edad>a.getEdad()){ //El objeto 1 es mayor que la pasada por parametro estado=1; } return estado; } |
Veamos un ejemplo practico:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public class EmpleadoApp { public static void main(String[] args) { //Creamos dos objetos distintos Empleado empleado1=new Empleado("Fernando", "Ureña", 23, 600); Empleado empleado2=new Empleado("Antonio", "Lopez", 28, 900); //Comprobamos cual es mayor (empleado2 es mayor que empleado1) System.out.println("Resultado: "+empleado1.compareTo(empleado2)); if (empleado1.compareTo(empleado2)==1){ System.out.println("El empleado1 es mayor que el empleado2"); }else{ System.out.println("El empleado2 es mayor que el empleado1"); } //Creamos un objeto nuevo Empleado empleado3=new Empleado("Fernando", "Ureña", 19, 100); //Comprobamos cual es mayor (empleado3 es mayor que empleado2) System.out.println("Resultado: "+empleado2.compareTo(empleado3)); if (empleado2.compareTo(empleado3)==1){ System.out.println("El empleado2 es mayor que el empleado3"); }else{ System.out.println("El empleado3 es mayor que el empleado2"); } } } |
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Hola,
está muy bien explicado, enhorabuena. Sin embargo veo que desde Java 7 se obliga a sobrescribir el método equals con lo que, si como en el ejemplo, creamos un objeto p de Persona no lo estamos haciendo y eso puede derivar en problemas posteriores (no es lo recomendado)
Según la nueva nomenclatura hay que usar (Object obj) en vez de (Persona p) y luego castear object a la clase Persona para que la tome como referencia.
Persona p = (Persona) obj
Es sólo un apunte, gracias por el contenido.
public boolean equals (Empleado a){
if(a.getNombre().equals(nombre) && a.getApellido().equals(apellido)){
return true;
}else{
return false;
}
}
Esta parte me marca errónea net beans –> a.getNombre().equals(nombre) && a.getApellido().equals(apellido)
No puedes llamar desde el parámetro «a ,a un método get y también llamar al método equals. No se si me explico.
Como solución seria usar un operador de igualdad y no equals.
a.getNombre()==nombre && a.getApellido().==apellido
Necesito hacer un programa capaz de comparar dos libros y mostrar el que tenga mayor numero de paginas. Teniendo en cuenta que tendremos dos clases (clase libros, clase main para ejecutar). tres atributos (string autor, titulo y como int paginas).
¿Como podría hacerlo sin el ArrayList?
si