Comparación de objetos en Java

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:

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.

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.

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:

public class Empleado implements Comparable<Empleado>

Como vemos, usamos <nombre_clase> para implementar esta interfaz, es porque esta parametrizada, esto lo explicaremos con mas detalle más adelante.

Ahora nos obligara a implementar el método compareTo, esta es su definición:

public int compareTo (objeto_clase a)

Implementaremos el método según como queramos determinar que un objeto es mayor que otro. Así queda:

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:

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.

¿Te ha gustado y quieres apoyarme? ¡Sé mi patrón!
Etiquetas

10 comments

  1. Esto de “if” y “Else” si me suena de mis clases de informatica, aunque a mi el unico programa que me enseñaron a manejar es el Turbo C ++. Por eso es que no entiendo nada de otros programas…. pero mmm creo que ya voy captando Java… es el codigo Html con el que se hacen las paginas no???

    Hablando de eso tengo un problema en mi blog, ya instale el boton + 1 , puse el gaget de google, lo intente instalar manualmente en el codigo de la plantilla… y ps nada que el maldito boton no quiere hacer acto de presencia… Algunda idea de porque sera eso?
    Sera culpa de mi plantilla o algo así?

    Saludos…

    te hare amigo en google + si aun no te tengo

    Traffic Club

    Blog de warrior oThe Outsiders Inc.

  2. Creo que te confundes con JavaScript, no tiene nada que ver con Java.

    En cuanto a lo de tu botón, a mi me paso algo parecido con lo del botón de Google+, puedes probar a cambiar de plantilla o esperar a que google lo arregle. Prueba a buscar en Internet, debe haber algún widget más aunque no sea de google. Un saludo y gracias por tu comentario.

  3. Hola soy nuevo en esto de la programación esta todo muy bien explicado pero como le haría si tengo un Arraylist lleno de objetos tipo Empleado y quisiera saber si entre esos mismos objetos hay alguno que se repita por ejemplo:
    Si en mi mismo ArrayList hubiera estos dos objetos :
    Empleado empleado1=new Empleado(“Fernando”, “Ureña”, 23, 600);
    Empleado empleado2=new Empleado(“Fernando”, “Ureña”, 23, 600);
    Como podría extraer esos que están repetidos para así uno de ellos asignarle por ejemplo un nuevo apellido para que se vuelva un objeto diferente??? .Todo esto sin perder ningún objeto! , Osea seguir conservando los objetos:
    empleado1
    empleado2
    pero ya con atributos diferentes, por lo que nunca cambiaria el tamaño de mi ArrayList… Alguien que pueda ayudarme se lo agradecería bastante!!

  4. Facil, tendrias que tener un metodo equal para determinar cual es o no igual, recorrer el arrayList con dos bucles anidados y cuando encuentre el repetido (siempre que no sea el mismo objeto) pues le cambias lo que quieras con los metodos set de los atributos.

    Si necesitas algo mas, puedes contactar con nosotros, desde contactanos.

    Un saludo.

  5. saludos,

    if(this.edad==a.getEdad()){ <<<— aqui podemos usar a.edad para trabajar con ese valor en vez de una funcion getEdad ??
    lo compile y no da error….hay alguna diferencia practica ?

    gracias…

    PD excelentes posts

  6. Para lo que dices, debes hacer public en el atributo de edad.

    Pero no es recomendable que se pueda acceder a los atributos de forma directa.

    Un saludo

  7. Buenas, te hago una consulta. Yo tengo un arraylist donde tengo varias clases heredadas de “Persona”, es decir “Empleado” y “Proveedor”, como puedo hacer para recorrer esta lista y filtrar los que pertenecen a la clase “Empleado” y los que pertenecen a “Proveedor”?

    Saludos y gracias

  8. Deberían de haber puesto el codigo completo para los que no entendemos y literalmente estamos empezando. En mi caso en vez de dos strings (nombre y apellido) yo tenía que comparar un string y un número. Sin embargo nunca pude hacer mover el metodo. simplemente me tira un error diciendo que el parametro ese del metodo boleano cannot be resolved to a type….

  9. Olviden mi comentario anterior, ya lo logré. Por una pequeña letra no me arrancaba el asunto jaja

  10. Hola puede ser que este mal la sintaxis en la linea 3 dentro del metodo equals (en el segundo fragmento de codigo)??

    if(a.getNombre().equals(nombre) && a.getApellido().equals(apellido)){

    no deberia ser ???

    if(a.getNombre()==nombre) && (a.getApellido()==apellido){

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *