Bom dia, estou praticando alguns exercícios em java, e estou com a seguinte dificuldade em um deles. Preciso fazer uma ordenação por dois atributos.
Tenho os atributos Nome e Média no meu objeto Aluno, e preciso fazer a ordenação com base neles. As regras para ordenação é:
- Ordenar pelo nome, caso tenha dois iguais, ordene pela maior média.
Implementei a interface Comparable na minha classe Aluno, e com isso o método compareTo.
package exercicio2;
public class Aluno implements Comparable<Aluno> {
String nome;
int nota1;
int nota2;
Double media;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getNota1() {
return nota1;
}
public void setNota1(Integer nota1) {
this.nota1 = nota1;
}
public Integer getNota2() {
return nota2;
}
public void setNota2(Integer nota2) {
this.nota2 = nota2;
}
public Double getMedia() {
return media;
}
public void setMedia(Double media) {
this.media = media;
}
/*
* so pra constar, o compareTo tem 3 retornos possiveis, -1, 0 e 1 quando
* for -1 o numero é menor, 0 representa igualdade e 1 representa que é
* maior
*/
@Override
public int compareTo(Aluno a) {
//return media.compareTo(a.getMedia());
int n = getNome().compareTo(a.getNome());
if (n != 0)
return n;
else
return media.compareTo(a.getMedia());
}
}
package exercicio2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Aluno[] alunos = new Aluno[3];
ArrayList<Aluno> lista = new ArrayList<Aluno>();
String[] nomes = { "Luiza", "Dyego", "Luiza" };
int[] nota1 = { 40, 90, 80 };
int[] nota2 = { 30, 100, 40 };
for (int i = 0; i < alunos.length; i++) {
alunos[i] = new Aluno();
alunos[i].nome = nomes[i];
alunos[i].nota1 = nota1[i];
alunos[i].nota2 = nota2[i];
alunos[i].media = new Double((nota1[i] + nota2[i]) / 2);
lista.add(alunos[i]);
}
// Ordenar os alunos
// Regras: Ordenar pelos nomes, caso tenha dois alunos com nomes iguais,
// vale a maior média;
Collections.sort(lista);
for (Iterator<Aluno> iterator = lista.iterator(); iterator.hasNext();) {
Aluno aluno = (Aluno) iterator.next();
System.out.println("Nome : " + aluno.getNome());
System.out.println("Nota1: " + aluno.getNota1());
System.out.println("Nota2: " + aluno.getNota2());
System.out.println("Media: " + aluno.getMedia());
System.out.println("Hash : " + aluno.hashCode());
System.out.println("\n");
}
}
}
No código acima, estou verificando se os nomes não são iguais, se forem ele ordena pela média.
Ele ordena pelo nome corretamente, mas quando tenho o teste onde dois nomes são iguais, no caso “Luiza”, para ele ordenar pela média, não funciona. Simplesmente não ordena.
Gostaria da ajuda de vocês para resolver esse problema.
Agradeço desde já! Obrigado.