Hola.
Aquí dejo otra posible solución al ejercicio CU00913C del tutorial de programación Java avanzado.
EJERCICIO
Utilizando Comparable y compareTo resuelve el siguiente problema donde debemos partir de una clase Persona con atributos nombre, edad y altura. Queremos ordenar por edad y por altura a las siguientes personas:
Nombre Altura Edad
Mario 187 22
Pepe 173 52
Manuel 158 27
David 164 25
Alberto 184 80
Debemos comparar las personas y ordenarlas por altura primero (de mayor a menor) y por edad (de menor a mayor) después. Por pantalla debe mostrarse la lista de personas sin ordenar, ordenada por altura y ordenada por edad. Ejemplo de ejecución:
Clase Persona:
package interfacecomparable;
public class Persona implements Comparable<Persona>, Cloneable {
private String nombre;
private int altura;
private int edad;
public Persona() {}
public Persona(String nombre, int altura, int edad) {
this.nombre = nombre;
this.altura = altura;
this.edad = edad;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public void setAltura(int altura) {
this.altura = altura;
}
public void setEdad(int edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public int getAltura() {
return altura;
}
public int getEdad() {
return edad;
}
@Override
public Persona clone() {
Persona clon = new Persona(this.nombre, this.altura, this.edad);
return clon;
}
@Override
public int compareTo(Persona persona) {
int resultado = 0;
if(this.altura < persona.altura) {
resultado = -1;
} else if(this.altura > persona.altura) {
resultado = 1;
} else {
resultado = 0;
}
return resultado;
}
public int compareToEdad(Persona persona) {
int resultado;
if(this.edad < persona.edad) {
resultado = -1;
} else if(this.edad > persona.edad) {
resultado = 1;
} else {
resultado = 0;
}
return resultado;
}
}
Clase TestCompararPersonas:
package interfacecomparable;
public class TestCompararPersonas {
public static void main(String[] args) {
Persona[] persona = new Persona[5];
Persona[] ordenadoPorAltura = new Persona[5];
Persona[] ordenadoPorEdad = new Persona[5];
persona[0] = new Persona("Mario", 187, 22);
persona[1] = new Persona("Pepe", 173, 52);
persona[2] = new Persona("Manuel", 158, 27);
persona[3] = new Persona("David", 164, 25);
persona[4] = new Persona("Alberto", 184, 80);
int posicion;
posicion = 1;
mustraArrays(persona, posicion, "Personas sin ordenar");
for(int i = 0; i < persona.length; i++) {
posicion = 0;
for(int j = 0; j < persona.length; j++) {
if(persona[i].compareTo(persona[j]) > 0) {
posicion++;
}
}
posicion = Math.abs(posicion-4);
ordenadoPorAltura[posicion] = persona[i].clone();
}
posicion = 1;
mustraArrays(ordenadoPorAltura, posicion, "Personas ordenadores por altura");
for(int i = 0; i < persona.length; i++) {
posicion = 0;
for(int j = 0; j < persona.length; j++) {
if(persona[i].compareToEdad(persona[j]) > 0){
posicion++;
}
}
ordenadoPorEdad[posicion] = persona[i].clone();
}
posicion = 1;
mustraArrays(ordenadoPorEdad, posicion,"Personas ordenadores por Edad");
}
public static void mustraArrays(Persona[] persona, int posicion, String msg) {
System.out.println(msg.concat("\n"));
for (Persona tmpItem : persona) {
System.out.println ("\t" + posicion++ + ". ".concat(tmpItem.getNombre().concat(" - Altura: ")) +
tmpItem.getAltura() + " - Edad: " + tmpItem.getEdad());
}
System.out.println("\n**************************************\n");
}
}
Como se pide comparar de dos formas distintas, para la primera de ellas, en la que se comparan las alturas, usé el método compareTo(), y para la segunda comparación creé un método alternativo a compareTo() para comparar las edades.
También en la clase donde está el main, creé un método para no repetir tantas veces la parte en la que se muestra el listado por pantalla.
Saludos.