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
-
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
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
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
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
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);
}
}
-
Hola.
La clase Comparator está mal escrita.
Fíjate que las dos condiciones de los if, son las mismas
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í:
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"
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.
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:
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);
}