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
CollectionsY 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);
}