Autor Tema: Java. Interface Comparable y método compareTo tener dos comparadores CU00913C#  (Leído 3061 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola.

Aquí dejo otra posible solución al ejercicio CU00913C del tutorial de programación Java avanzado.

Citar
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:

Código: [Seleccionar]
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:
Código: [Seleccionar]
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. ;D
« Última modificación: 31 de Diciembre 2016, 16:40 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2645
    • Ver Perfil
Buenas, muy buena solución al ejercicio!!!
« Última modificación: 16 de Enero 2017, 19:54 por Ogramar »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".