Autor Tema: Java Avanzado Ejercicio CU00913C interface Comparable, método compareTo API Java  (Leído 548 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola.
Dejo la ÚNICA SOLUCIÓN que se me ha ocurrido para el Ejercicio  CU00913C ejemplo resuelto interface Comparable y método compare To (API Java). Comparar objetos ()

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 del modulo de la clase Persona Comparable<Persona>
Código: [Seleccionar]
public class Persona implements Comparable<Persona>{
    public String nombre;
    public int edad, altura;

    //Constructor
    public Persona( String nom,int al, int ed){
        this.nombre=nom;
        this.altura = al;
        this.edad = ed;
    }

    //Metodos set
    public String getNombre(){ return nombre;}

    public int getAltura(){ return altura;}

    public int getEdad(){ return edad;}
    //Metodos get
    public void setNombre(){ this.nombre=nombre;}

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

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

    public String toString(){
        String msg="";
        msg="Nombre:\t"+nombre+"\tAltura:\t "+altura+"\tedad:  "+edad;
        return msg;
    }

    @Override //Anulamos el error y creamos otro compareTo
    // Asi evitamos crear un metodo para cada comparacion
    public int compareTo(Persona o ) {
       
        int resultado=0;
       

        return resultado;
    }
//Comparar por edad y altura
//Se le pasa la variable cadena para ejecutar la comparacion por edad o por altura
    public int compareToPersona(Persona o,String cadena ) {
        int resultado=0;
        if (cadena.equals("Edad")){
        if (this.edad<o.edad) {  resultado = 1;    }// Cambio el valor de resultado para no crear otro metodo de ordenacion
        else if (this.edad>o.edad) {   resultado = -1;   }
        else {   resultado = 0;   }
    }
      if (cadena.equals("Altura")){
        if (this.altura<o.altura) {   resultado = -1;      }
        else if (this.altura>o.altura) {    resultado = 1;      }
        else {   resultado = 0;   }
        }

        return resultado;
    }
}

Codigo del modulo de la Clase TestCompareTo
Código: [Seleccionar]
public class TestCompareTo
{

    public static void main(String arg[]) {   
        Persona[] persona=new Persona[5];
       
       
String comparePor;//Variable para utilizar en el método de burbuja y en el comparador                         
                           //Seleccionamos la ordenación por Edad o Altura

        persona[0] = new Persona("Mario",187,22);
        persona[1] = new Persona("Pepe",176,52); 
        persona[2] = new Persona("Manuel",158,27); 
        persona[3] = new Persona("David",164,25); 
        persona[4] = new Persona("Alberto",184,80); 
        System.out.println("\n\nArray desordenado");
        for(int i=0;i < persona.length;i++){
            System.out.println(persona[i]);
        }
        comparePor="Altura";//Ordenar y comparar por altura
        burbuja(persona,comparePor);
        System.out.println("\n\nArray Ordenado por altura de mas altura a menos altura");
        for(int i=0;i < persona.length;i++){
            System.out.println(persona[i]);
        }
        comparePor="Edad";//Ordenar y comparar por Edad
        burbuja(persona,comparePor);
        System.out.println("\n\nArray Ordenado por edad de menos edad a mas edad");
        for(int i=0;i < persona.length;i++){
            System.out.println(persona[i]);
        }

    }// Fin del main
    //*****************************************************
    //Metodo de ordenacion por burbuja 
    public static void burbuja(Persona[]matriz,String comparePor){
        Persona[] buffer=new Persona[5];
        int i,j;
        for(i = 0; i < matriz.length; i++)
        {
            for(j = 0; j < i; j++)
            {//Si queremos ordenar de menor a mayor solo hay que cambiar > por <
                if(matriz[i].compareToPersona(matriz[j],comparePor)>0){
                    buffer[0] = matriz[j];
                    matriz[j] = matriz[i];
                    matriz[i] = buffer[0];
                }
            }
        }
    }//Fin metodo Burbuja
   
}//Fin de la Clase

Gracias. ;)

lcanciani

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Me esta quemando la cabeza este ejercicio.
No entiendo como trabajan esta parte :
Citar
int i,j;
        for(i = 0; i < matriz.length; i++)
        {
            for(j = 0; j < i; j++)
            {//Si queremos ordenar de menor a mayor solo hay que cambiar > por <
                if(matriz.compareToPersona(matriz[j],comparePor)>0){
                    buffer[0] = matriz[j];
                    matriz[j] = matriz;
                    matriz = buffer[0];
                }
            }
        }

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola lcanciani. Es un poco lioso de entender al principio pero una vez  se coge el "tranquillo" es facil de entender.

int i,j; Creamos dos variable para los bucles for
       
 for(i = 0; i < matriz.length; i++) el for i se ejecutara mientras se menor que la longitud de la matriz
        {
            for(j = 0; j < i; j++) El for j se ejecuta mientras sea menor que i

Ahora viene la mama del corderito.

          Si (matriz.compareToPersona(matriz[j],comparePor)>0 ( si es 1) entra en el bucle
                    if(matriz.compareToPersona(matriz[j],comparePor)>0){
         

                    buffer[0] = matriz[j]; Se copia el valor de matriz[j] en buffer[0]
                    matriz[j] = matriz[ i ]; Se copia el valor de matriz[ i ] en matriz[j]
                    matriz[ i ] = buffer[0];Se copia el valor de buffer[0] an matriz[ i ] y se hace el intercambio
                     del mayor con el menor
                }
            }
        }
 Te dejo el mismo código modificado para que veas el funcionamiento del intercambio.
Si cambias el operador > en el if  "if(matriz.compareToPersona(matriz[j],comparePor)>0) por < se aprecia mejor el intercambio.

Código: [Seleccionar]
import java.util.*;
import java.util.Scanner;
/**
 * Write a description of class TestCompareTo here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class TestCompareTo2
{

    public static void main(String arg[]) {   
        Persona2[] persona=new Persona2[5];
        //Variable para utilizar en el metodo de burja y en el comparador
        //Seleccionamos la ordenacion por Edad o Altura
        String comparePor;

        persona[0] = new Persona2("Mario",187,22);
        persona[1] = new Persona2("Pepe",176,52); 
        persona[2] = new Persona2("Manuel",158,27); 
        persona[3] = new Persona2("David",164,25); 
        persona[4] = new Persona2("Alberto",184,80); 
        System.out.println(" Array desordenado");
        for(int i=0;i < persona.length;i++){
            System.out.println(persona[ i ]);
        }
        comparePor="Altura";//Ordenar y comparar por altura
        burbuja(persona,comparePor);
        System.out.print ("\n\nArray Ordenado por altura de mas altura a menos altura\n");
        for(int i=0;i < persona.length;i++){
            System.out.println(persona[i]);
        }
       

    }// Fin del main
    //*****************************************************
    //Metodo de ordenacion por burbuja 
    public static void burbuja(Persona2[]matriz,String comparePor){
        Persona2[] buffer=new Persona2[5];
         String entradaTeclado;
        int i,j;
        System.out.println("Intercambio por altura");
         Scanner entradaEscaner = new Scanner (System.in);
        for(i = 0; i < matriz.length; i++)
        {
            for(j = 0; j < i; j++)
            {
                 System.out.println("Antes de intercambio "+matriz[i].getAltura()+
                 " matriz j["+j+"]= "+matriz[j].getAltura());
               
                 //entradaTeclado = entradaEscaner.nextLine ();
                if(matriz[i].compareToPersona(matriz[j],comparePor)<0){
                    buffer[0] = matriz[j];
                    matriz[j] = matriz[i];
                    matriz[i] = buffer[0];
                   
                }
                System.out.print("Intercambio "+matriz[i].getNombre()+"  "+ matriz[i].getAltura()+"\n"+
                                 "Por         "+matriz[j].getNombre()+"  "+ matriz[j].getAltura()+"\n");
                 
                for(int z=0; z<matriz.length;z++){System.out.println(matriz[z]);}
            }
            entradaTeclado = entradaEscaner.nextLine ();
        }
    }//Fin metodo Burbuja

}//Fin de la Clase




Código: [Seleccionar]

public class Persona2 implements Comparable<Persona2>{
    public String nombre;
    public int edad, altura;

    //Constructor
    public Persona2( String nom,int al, int ed){
        this.nombre=nom;
        this.altura = al;
        this.edad = ed;
    }

    //Metodos set
    public String getNombre(){ return nombre;}

    public int getAltura(){ return altura;}

    public int getEdad(){ return edad;}
    //Metodos get
    public void setNombre(){ this.nombre=nombre;}

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

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

    public String toString(){
        String msg="";
        msg="Nombre:\t"+nombre+"\tAltura:\t "+altura+"\tedad:  "+edad;
        return msg;
    }

    @Override //Anulamos el error y creamos otro compareTo
    // Asi evitamos crear un metodo para cada comparacion
    public int compareTo(Persona2 o ) {

        int resultado=0;
        if (this.edad<o.edad) {  resultado = 1;    }// Cambio el valor de resultado para no crear otro metodo de ordenacion
        else if (this.edad>o.edad) {   resultado = -1;   }
        else {   resultado = 0;   }
        return resultado;
    }
    //Comparar por edad y altura
    //Se le pasa la variable cadena para ejecutar la comparacion por edad o por altura
    public int compareToPersona(Persona2 o,String cadena ) {
        int resultado=0;
        if (cadena.equals("Edad")){
            if (this.edad<o.edad) {  resultado = 1;    }// Cambio el valor de resultado para no crear otro metodo de ordenacion
            else if (this.edad>o.edad) {   resultado = -1;   }
            else {   resultado = 0;   }
        }
        if (cadena.equals("Altura")){
            if (this.altura<o.altura) {   resultado = -1;      }
            else if (this.altura>o.altura) {    resultado = 1;      }
            else {   resultado = 0;   }
        }
        if (cadena.equals("Nombre")){

        }
        return resultado;
    }
}


Espero que la respuesta te aclare las dudas.
Un saludo  ;)
« última modificación: 22 de Febrero 2019, 20:31 de Ogramar »

 

Esto es un laboratorio de ideas...
Aprender a programar

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