Autor Tema: Java crear ranking Comparator ordenar por calificaciones intefaz gráfica swing  (Leído 2034 veces)

wwmeowo

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
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);
    }
}

« Última modificación: 13 de Enero 2022, 18:54 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Ayuda con ejercicio de java
« Respuesta #1 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);
       
    }
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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