Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: wwmeowo en 26 de Mayo 2021, 09:37

Título: Java crear ranking Comparator ordenar por calificaciones intefaz gráfica swing
Publicado por: wwmeowo en 26 de Mayo 2021, 09:37
Saludos! Por favor, necesito ayuda a completar este ejercicio, no logro solucionarlo y no quiero quedarme con la duda. Se lo agradecería si alguien me ayuda y comparto de mi parte.

Mi problema es hacer un método que genere el ranking de la calificación aleatoria que se asigna a los participantes de la competencia.

Hice hasta cierta parte que es poder asignar una calificación aleatoria a cada participante, solo que no logre ordenar esas calificaciones y que se muestre como el ranking, es decir, de mayor a menor las calificaciones aleatorias

-

Empecé con la clase principal Perro

Código: [Seleccionar]
public class Perro {
   
    private String nombPerro;
    private String nombDueño;
    private String raza;
    private String tamaño;
    private String placa;
    private String edad;
    private String peso;
    private int nota;

    public String getNombPerro() {
        return nombPerro;
    }

    public void setNombPerro(String nombPerro) {
        this.nombPerro = nombPerro;
    }

    public String getNombDueño() {
        return nombDueño;
    }

    public void setNombDueño(String nombDueño) {
        this.nombDueño = nombDueño;
    }

    public String getRaza() {
        return raza;
    }

    public void setRaza(String raza) {
        this.raza = raza;
    }

    public String getTamaño() {
        return tamaño;
    }

    public void setTamaño(String tamaño) {
        this.tamaño = tamaño;
    }

    public String getPlaca() {
        return placa;
    }

    public void setPlaca(String placa) {
        this.placa = placa;
    }

    public String getEdad() {
        return edad;
    }

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

    public String getPeso() {
        return peso;
    }

    public void setPeso(String peso) {
        this.peso = peso;
    }
   
    public int getNota() {
        return nota;
    }

    public void setNota(int nota) {
        this.nota = nota;
    }   
}


En esta clase uso arraylist y aqui se encuentran todas las operaciones

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JOptionPane;
import java.util.Random;

public class Competencia {
   
    ArrayList<Perro> registro = new ArrayList();
   
    //METODO ENTRADA ES PARA USAR VENTANAS (JOPTIONPANE) PARA USARSE EN EL METODO AGREGAR DATOS
    public String entrada(String dato){
        return JOptionPane.showInputDialog(dato);
    }
   
    public void agregarDatos(){
       
        String nombDueño = entrada("Nombre del Dueño");
        String nombPerro = entrada("Nombre del Perro");
        String raza = entrada("Raza del Perro");
        String tamaño = entrada("Tamaño del Perro");
        String placa = entrada("Placa del Perro");
        String edad = entrada("Edad de Perro");
        String peso = entrada("Peso de Perro");
       
        Perro p = new Perro();
        p.setNombDueño(nombDueño);
        p.setNombPerro(nombPerro);
        p.setRaza(raza);
        p.setTamaño(tamaño);
        p.setPlaca(placa);
        p.setEdad(edad);
        p.setPeso(peso);
               
        registro.add(p);
       
        //AGREGACION DE DATOS RANDOM PARA MOSTRAR EN UN METODO LA CALIFICACION
        Random r = new Random();
        int nota = r.nextInt(10)+1;
       
        p.setNota(nota);
       
    }
   
    public void listaDatos(){
        //METODO PARA MOSTRAR EN FORMA DE LISTA LOS DATOS QUE SE AGREGARON
        String dato = "";
        for (int i = 0; i < registro.size(); i++) {
            dato += "       Participante Nro." + (i+1) +"\n";
            dato += "Nombre del dueño: " + registro.get(i).getNombDueño() +"\n";
            dato += "Nombre del perro: " + registro.get(i).getNombPerro() +"\n";
            dato += "Raza: " + registro.get(i).getRaza() +"\n";
            dato += "Tamaño: " + registro.get(i).getTamaño() +"\n";
            dato += "Placa: " + registro.get(i).getPlaca() +"\n";
            dato += "Edad: " + registro.get(i).getEdad() +"\n";
            dato += "Peso: " + registro.get(i).getPeso() +"\n";
           
        }
        JOptionPane.showMessageDialog(null, dato);
    }
   
    public boolean buscarPlaca(String placa){
       
        boolean bandera = false;
        int i = 0;
        //PARA ORDENAR LOS OBJETOS DEL ARRAYLIST
        while (bandera == false && i < registro.size()) {           
            if (registro.get(i).getPlaca().compareToIgnoreCase(placa)==0) {
                bandera = true;
            } else{
                i++;
            }
        }
        //INDICAMOS AL PRINCIPIO QUE BANDERA ES FALSE ENTONCES DE RETORNO SE IMPRIMEN EN FORMA DE LISTA LOS OBJETOS DENTRO DEL ARRAYLIST
        if (bandera) {
           
            JOptionPane.showMessageDialog(null,"        Participante Nro." +(i+1) +"\n"
                                          +"Nombre del dueño: " +registro.get(i).getNombDueño() +"\n"
                                          +"Nombre del perro: " +registro.get(i).getNombPerro() +"\n"
                                          +"Raza: " +registro.get(i).getRaza() +"\n"
                                          +"Tamaño: " +registro.get(i).getTamaño() +"\n"
                                          +"Placa: " +registro.get(i).getPlaca() +"\n"
                                          +"Edad: " +registro.get(i).getEdad() +"\n"
                                          +"Peso: " +registro.get(i).getPeso() +"\n");
            return false;
        } else{
            //SI EL DATO QUE INGRESO NO COICIDE CON EL OBJETO ENTONCES SE VA IMPRIMIR EL MENSAJE DE QUE NO EXISTE
            JOptionPane.showMessageDialog(null, "La placa no esta registrada");
            return true;
        }
       
    }
   
    public void mostrarCalificacion(){
        String dato = "";
       
        for (int i = 0; i < registro.size(); i++) {
            dato += "       Participante Nro." + (i+1) +"\n";
            dato += "Calificacion: " + registro.get(i).getNota() +"\n";
        }
        JOptionPane.showMessageDialog(null, dato);
    }
   
    public void ranking(){
       
        Collections.sort(registro, new OrdenandoCalificacion());
       
        String dato = "";
       
        for (int i = registro.size(); i < 3; i++) {
            dato += "       RANKING DE PREMIADOS"+ "\n";
            dato += "Participante Nro."+registro.get(i).getPlaca() +"\n";
            dato += "Calificacion: "+registro.get(i).getNota();
        }
        JOptionPane.showMessageDialog(null, dato);
       
    }
       
    public void eliminarLista(){
        registro.clear();
    }
}   


En esta clase intente hacer ordenamiento del arraylist

Código: [Seleccionar]
import java.util.Comparator;

public class OrdenandoCalificacion implements Comparator<Perro> {
   
    @Override
    public int compare(Perro o1, Perro o2) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
       
        if (o1.getNota()>o2.getNota()) {
            return -1;
        } else if (o1.getNota()>o2.getNota()) {
            return 0;
        } else{
            return 1;
        }
    }
}

por ultimo la clase principal, que solamente tiene de metodo un menu
Código: [Seleccionar]
import javax.swing.JOptionPane;

public class Principal {
   
    public static void main(String[] args) {
       
        Principal p = new Principal();

        p.menu();
    }
   
    public void menu(){
       
        Competencia c = new Competencia();
       
        int opcion;
       
        do {           
            opcion = Integer.parseInt(JOptionPane.showInputDialog(null,"             COMPETENCIA CANINA"
                    +"\n 1. Registro de participantes"
                    +"\n 2. Información de participantes"
                    +"\n 3. Calificaciones"
                    +"\n 4. Ranking de premiados"
                    +"\n 5. Consultar info de un participante"
                    +"\n 6. Eliminar lista de registro"
                    +"\n 7. SALIR"
                    +"","MENU PRINCIPAL",JOptionPane.QUESTION_MESSAGE));
           
            switch(opcion){
            case 1:
                c.agregarDatos();
                break;
            case 2:
                c.listaDatos();
                break;
            case 3:
                //c.calificacion();
                c.mostrarCalificacion();
                break;
            case 4:
                c.ranking();
                break;
            case 5:
                boolean valor = false;
                do {
                    String placa = JOptionPane.showInputDialog("     CONSULTAR INFO DE UN PARTICIPANTE"
                                                               + "\nIngrese la placa del perro");
                    valor = c.buscarPlaca(placa);
                } while (valor);
                break;
            case 6:
                c.eliminarLista();
                break;
            case 7:
                JOptionPane.showMessageDialog(null, "    FINALIZO EL PROGRAMA");
                //System.out.println("");
                System.exit(0);
                break;
            default:
                System.out.println();
               
                JOptionPane.showInputDialog(null,"        ELIJA UNA OPCION VALIDA"
                                                + "\n 1. Volver","ERROR",JOptionPane.WARNING_MESSAGE);
            }
        } while (opcion!=7);
    }
}

Título: Re: Ayuda con ejercicio de java
Publicado por: Kabuto en 26 de Mayo 2021, 12:21
Hola.

La clase Comparator está mal escrita.

Fíjate que las dos condiciones de los if, son las mismas
Citar
        if (o1.getNota()>o2.getNota()) {
            return -1;
        } else if (o1.getNota()>o2.getNota()) {
            return 0;
        } else{
            return 1;
        }


Para que quede bien, y ordene de mayor a menor, lo escribiríamos así:

Código: [Seleccionar]
public class OrdenandoCalificacion implements Comparator<Perro> {
   
    @Override
    public int compare(Perro o1, Perro o2) {
       
        if (o1.getNota() < o2.getNota()) { //Si primer perro tiene nota menor
            return 1; //Retornamos positivo porque ha de quedar por DETRÁS de los MAYORES
        } else if (o1.getNota() > o2.getNota()) { //Si primer perro tiene nota mayor
            return -1; //Retornamos negativo porque ha de quedar por DELANTE de los MENORES
        } else{ //Si son iguales
            return 0; //Retornamos 0
        }
    }
}

Luego, hay otro error, en la clase Competencia, en el método donde ordenamos y mostramos el ranking.
El bucle for inicializa su índice con el valor del tamaño del array registro, es decir, que si tenemos 10 participantes registrados, la i comienza con valor 10.
Y luego le pides que el bucle se repita, mientras se menor que 3. ¿Por qué 3?
Es decir, no se va a ejecutar si tenemos 3 o más participantes registrados, porque la i ya comienza con un valor que no es "menor que 3"

Citar
    public void ranking(){
       
        Collections.sort(registro, new OrdenandoCalificacion());
       
        String dato = "";
       
        for (int i = registro.size(); i < 3; i++) {
            dato += "       RANKING DE PREMIADOS"+ "\n";
            dato += "Participante Nro."+registro.get(i).getPlaca() +"\n";
            dato += "Calificacion: "+registro.get(i).getNota();
        }
        JOptionPane.showMessageDialog(null, dato);
       
    }

Parece más lógico que la i comience con valor 0 y se repita mientras no alcance el tamaño del arraylist, para así mostrar todos los participantes.

Código: [Seleccionar]
    public void ranking(){
       
        Collections.sort(registro, new OrdenandoCalificacion());
       
        String dato = "";
       
        for (int i = 0; i < registro.size(); i++) {
            dato += "       RANKING DE PREMIADOS"+ "\n";
            dato += "Participante Nro."+registro.get(i).getPlaca() +"\n";
            dato += "Calificacion: "+registro.get(i).getNota();
        }
        JOptionPane.showMessageDialog(null, dato);
       
    }

Ahora sí, el ranking se ordena y se muestra por completo.

Por cierto, los ArrayList ya incorporan el método sort(), así que también le puedes pedir a él que ordene sin tener que llamar a la clase Collections

Y la cadena "RANKING DE PREMIADOS" se añade al texto para cada participante.
Para que solo salga una vez, a modo de título, tenemos que añadirlo al String dato al principio, antes de que comience el bucle.
Así queda mejor:

Código: [Seleccionar]
    public void ranking(){
       
        //Collections.sort(registro, new OrdenandoCalificacion());
    registro.sort(new OrdenandoCalificacion());
       
        String dato = "       RANKING DE PREMIADOS\n";
       
        for (int i = 0; i < registro.size(); i++) {
            dato += "\n";
            dato += "Participante Nro."+registro.get(i).getPlaca() +"\n";
            dato += "Calificacion: "+registro.get(i).getNota();
        }
        JOptionPane.showMessageDialog(null, dato);
       
    }