Autor Tema: JAVA cómo comparar de dos maneras Interface Comparable metodo compareTo CU00913C  (Leído 864 veces)

elendur14

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Buen día a todos, sigo con la programacion de JAVA Avanzado. Dejo el siguiente código, propuesta de solución para el ejercicio CU00913C del tutorial de programación orientada a objetos. Tomo nota de sus comentarios.

Respecto al codigo, he aplicado lo que he aprendido en el basico y este.

He escrito el codigo en dos clases y lo he tratado de hacer los mas claro posible.

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

1. Mario - Altura: 187 - Edad: 22
2. Pepe - Altura: 173 - Edad: 52
3. Manuel - Altura: 158 - Edad: 27
4. David - Altura: 164 - Edad: 25
5. Alberto - Altura: 184 - Edad: 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:

 

Personas sin ordenar

1. Mario - Altura: 187 - Edad: 22
2. Pepe - Altura: 173 - Edad: 52
3. Manuel - Altura: 158 - Edad: 27
4. David - Altura: 164 - Edad: 25
5. Alberto - Altura: 184 - Edad: 80

 

Personas ordenadas por altura
1. Mario - Altura: 187 - Edad: 22
2. Alberto - Altura: 184 - Edad: 80
3. Pepe - Altura: 173 - Edad: 52
4. David - Altura: 164 - Edad: 25
5. Manuel - Altura: 158 - Edad: 27

Personas ordenadas por edad
1. Mario - Altura: 187 - Edad: 22
2. David - Altura: 164 - Edad: 25
3. Manuel - Altura: 158 - Edad: 27
4. Pepe - Altura: 173 - Edad: 52
5. Alberto - Altura: 184 - Edad: 80


Código: [Seleccionar]
package ejerciciocompare;

public class Persona implements Comparable<Persona> {

    private String nombre;
    private float altura;
    private int edad;
    private int numero;
    private static String opcion = "";

    public Persona(String nombre, int altura, int edad) {
        this.nombre = nombre;
        this.altura = altura;
        this.edad = edad;
        this.numero = 0;
    }

    public Persona() {
        this.nombre = "";
        this.altura = 0;
        this.edad = 0;
        this.numero = 0;
    }

    @Override
    public int compareTo(Persona temporal) {
        int resultado = 0;
        if (getOpcion().equals("ESTATURA")) {
            if (this.getAltura() < temporal.getAltura()) {
                resultado = 1;

            } else if (this.getAltura() > temporal.getAltura()) {
                resultado = -1;
            }
        } else if (getOpcion().equals("EDAD")) {

            if (this.getEdad() < temporal.getEdad()) {
                resultado = -1;
            } else if (this.getEdad() > temporal.getEdad()) {
                resultado = 1;
            }
        }
        return resultado;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public float getAltura() {
        return altura;
    }

    public void setAltura(float altura) {
        this.altura = altura;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public String getOpcion() {
        return opcion;
    }

    public void setOpcion(String opcion) {
        this.opcion = opcion;
    }

}

Código: [Seleccionar]
package ejerciciocompare;

import java.util.ArrayList;
import java.util.Iterator;

public class Principal {

    private static Persona tmpPersona = new Persona();
    private static Persona tmpPersona2 = new Persona();
    private static ArrayList<Persona> listaPersonas = new ArrayList<Persona>();
    private static Persona persona = new Persona();

    public static void main(String[] args) {

        Persona p1 = new Persona("Mario", 145, 22);
        Persona p2 = new Persona("Pablo", 150, 52);
        Persona p3 = new Persona("Manuel", 158, 27);
        Persona p4 = new Persona("David", 164, 25);
        Persona p5 = new Persona("Alberto", 177, 80);
        Persona p6 = new Persona("Josefa", 187, 34);

        listaPersonas.add(p1);
        listaPersonas.add(p2);
        listaPersonas.add(p3);
        listaPersonas.add(p4);
        listaPersonas.add(p5);
        listaPersonas.add(p6);

        System.out.println("Lista Original de Personas sin Ordenar: ");
        mostrarDatos();

        System.out.println("\nLista ordenada por EDAD");
        ordenarPersonas("EDAD");
        mostrarDatos();

        System.out.println("\nLista Ordenada por ESTATURA");
        ordenarPersonas("ESTATURA");
        mostrarDatos();
    }

    public static void mostrarDatos() {

        if (persona.getOpcion().equals("")) {
            Iterator<Persona> it = listaPersonas.iterator();
            int x = 0;
            while (it.hasNext()) {
                tmpPersona = it.next();
                System.out.println((x + 1) + ". Nombre: " + tmpPersona.getNombre() + "\tEstatura: " + tmpPersona.getAltura() + "\tEdad: " + tmpPersona.getEdad());
                x++;
            }

        } else {
            for (int x = 0; x <= listaPersonas.size(); x++) {
                Iterator<Persona> it = listaPersonas.iterator();
                while (it.hasNext()) {
                    tmpPersona = it.next();
                    if (x == tmpPersona.getNumero()) {
                        System.out.println((x + 1) + ". Nombre: " + tmpPersona.getNombre() + "\tEstatura: " + tmpPersona.getAltura() + "\tEdad: " + tmpPersona.getEdad());
                    }

                }
            }
        }
    }

    public static void ordenarPersonas(String opcion) {
        persona.setOpcion(opcion);

        int numero;

        Iterator<Persona> it2 = listaPersonas.iterator();
        while (it2.hasNext()) {

            Iterator<Persona> it = listaPersonas.iterator();
            numero = 0;
            tmpPersona = it2.next();
            while (it.hasNext()) {
                tmpPersona2 = it.next();
                if (tmpPersona.compareTo(tmpPersona2) > 0) {
                    numero++;
                }

            }
            tmpPersona.setNumero(numero);
        }

    }
}
« Última modificación: 15 de Octubre 2020, 20:16 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2646
    • Ver Perfil
Buenas, para quien revise este ejercicio algunos comentarios.

- Al tener que realizar comparaciones de dos maneras distintas, podríamos pensar en usar la interface Comparator, explicada en la entrega CU00918C del curso, pero como en esta entrega no se ha explicado aún hay que hacerlo bien creando dos clases distintas, bien con algún artificio (como se hace en este caso) o bien con otro método (como se hace en https://aprenderaprogramar.com/foros/index.php?topic=5704.0) o de otra manera.

- Para resolver este ejercicio podemos dar por bueno un artificio como el atributo opcion en la clase Persona, aunque en un caso real esto no sería lógico, ya que un compareTo define un orden natural en base a un único criterio, no en base a diferentes criterios. Cuando se tuvieran múltiples criterios usaríamos la interface Comparator.

- De resto el código parece funcionar bien, aunque desde mi punto de vista abusa de atributos y métodos estáticos, que en general no son indicativos de un buen diseño.

Salu2

 

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".