Hola.
En mi solución solo he usado la interface Comparable, no la Cloneable, ya que no se trata de guardar la lista de personas ordenadas, sino de mostrarlas ordenadas, por lo que me limito a crear un array adicional de 5 personas cuyos elementos apuntan ordenadamente, según el criterio de ordenación especificado, a las instancias de Persona que se crean al principio del método main. Así se usaría menos memoria.
No he encontrado la manera de sobreescribir el método compareTo de forma que pueda usarse para cualquiera de los dos criterios de ordenación, por lo que he tenido que crear otro método para la altura (he considerado que es más habitual ordenar por edades).
Ahí adjunto mi solución. Espero las críticas del resto de usuarios.
Clase Persona
public class Persona implements Comparable<Persona>{
private String nombre;
private int edad, altura;
public Persona(String nombre, int edad, int altura){
this.nombre=nombre;
this.edad=edad;
this.altura=altura;
}
public String getNombre(){return this.nombre;}
public int getEdad(){return this.edad;}
public int getAltura(){return this.altura;}
@Override
public int compareTo(Persona o){
int resultado=0;
if (this.edad>o.edad){ resultado=1; }
else if (this.edad<o.edad){ resultado=-1; }
return resultado;
}
public int compareToAltura(Persona o){
int resultado=0;
if(this.altura>o.altura){resultado=+1;}
else if (this.altura<o.altura){resultado=-1;}
return resultado;
}
@Override
public String toString(){
return this.nombre+" - Altura: "+this.altura+" - Edad: "+this.edad;
}
}
Clase con el método main
public class CU00913C {
public static void main(String[] args) {
Persona[] personas = new Persona[5];
personas[0] = new Persona("Mario", 22, 187);
personas[1] = new Persona("Pepe", 52, 173);
personas[2] = new Persona("Manuel", 27, 158);
personas[3] = new Persona("David", 25, 164);
personas[4] = new Persona("Alberto", 80, 184);
Persona[] personasOrdenadas = new Persona[5];
System.out.println("Personas sin ordenar");
for(Persona tmp:personas){System.out.print(tmp.toString()+"\n");}
System.out.println();
System.out.println("Personas ordenadas por altura");
personasOrdenadas=OrdenarAltura(personas);
for(Persona tmp:personasOrdenadas){System.out.print(tmp.toString()+"\n");}
System.out.println();
System.out.println("Personas ordenadas por edad");
personasOrdenadas=OrdenarEdad(personas);
for(Persona tmp:personasOrdenadas){System.out.print(tmp.toString()+"\n");}
System.out.println();
}
//Ordena crecientemente por edades sin clonar ls objetos persona
public static Persona[] OrdenarEdad(Persona[] personas){
Persona[] ordenado = new Persona[5];
ordenado[0]=personas[0];
for (int i=1;i<5;i++){
int j=i;
while (j>0&&personas[i].compareTo(ordenado[j-1])<0){
ordenado[j]=ordenado[j-1];
j--;
}
ordenado[j]=personas[i];
}
return ordenado;
}
//Ordena decrecientemente por alturas sin clonar los objetos persona
public static Persona[] OrdenarAltura(Persona[] personas){
Persona[] ordenado = new Persona[5];
ordenado[0]=personas[0];
for (int i=1;i<5;i++){
int j=i;
while (j>0&&personas[i].compareToAltura(ordenado[j-1])>0){
ordenado[j]=ordenado[j-1];
j--;
}
ordenado[j]=personas[i];
}
return ordenado;
}