Tenho uma lista de objetos com nome do curso e do aluno. Preciso na mesma lista ordenar por curso e em cada tipo de curso ordenar os nomes dos alunos. Alguém tem alguma dica…
Fiz a ordenação só por curso, mas estou com dificuldade de ordenar pelos dois atributos:
Comparator compara = new Comparator() {
public int compare(Object obj1, Object obj2) {
ArquivoTO a1 = (ArquivoTO) obj1;
ArquivoTO a2 = (ArquivoTO) obj2;
return a1.getNomeAluno().compareToIgnoreCase(a2.getNomeAluno());
}
};
Collections.sort(listaArquivos, compara);
Estou supondo que ArquivoTO tenha um getter “public String getNomeCurso()”, e que nunca nenhum dos getters retorne null.
Comparator compara = new Comparator() {
public int compare(Object obj1, Object obj2) {
ArquivoTO a1 = (ArquivoTO) obj1;
ArquivoTO a2 = (ArquivoTO) obj2;
int c = a1.getNomeAluno().compareToIgnoreCase (a2.getNomeAluno());
if (c != 0) return c; // o primeiro campo já foi suficiente
// Como c == 0 então o nome de aluno bate. Vamos checar o nome do curso
c = a1.getNomeCurso().compareToIgnoreCase (a2.getNomeCurso());
return c;
}
};
Temtei fazer o q vc sugeriu mas mesmo assim não dá certo…ele acaba ordenando apenas pelo nome do aluno e os cursos ficam em desordem…
Fiz assim seguindo o q vc falou:
public void ordenarListaPorCursoAluno(List listaArquivos) {
Comparator compara = new Comparator() {
public int compare(Object obj1, Object obj2) {
ArquivoTO a1 = (ArquivoTO) obj1;
ArquivoTO a2 = (ArquivoTO) obj2;
int c = a1.getNomeAluno().compareToIgnoreCase(a2.getNomeAluno());
if (c != 0) {
return c;
} // o primeiro campo já foi suficiente
// Como c == 0 então o nome de aluno bate. Vamos checar o nome do curso
c = a1.getDescrCurso().compareToIgnoreCase(a2.getDescrCurso());
return c;
}
};
Collections.sort(listaArquivos, compara);
[quote=lsb]Tentei fazer o q vc sugeriu mas mesmo assim não dá certo…ele acaba ordenando apenas pelo nome do aluno e os cursos ficam em desordem…
[/quote]
Estranho, não deveria fazer isso. Você não está passando o comparador errado?
Eu testei o programa a seguir e ele mostrou a saída desejada.
import java.util.*;
class Ficha {
private String nomeAluno;
private String nomeCurso;
public Ficha (final String nomeAluno_, final String nomeCurso_) {
nomeAluno = nomeAluno_; nomeCurso = nomeCurso_;
}
public String getNomeAluno() { return nomeAluno; }
public String getNomeCurso() { return nomeCurso; }
public String toString() {
return "(Ficha: " + nomeAluno + ", " + nomeCurso + ")";
}
}
class TesteComparador {
public static void main(String[] args) {
List<Ficha> fichas = new ArrayList<Ficha>();
fichas.add (new Ficha ("Jose Aparecido", "MAT 400"));
fichas.add (new Ficha ("Abel Adamson", "ERR 500"));
fichas.add (new Ficha ("Maria Auxiliadora", "ELE 220"));
fichas.add (new Ficha ("Maria Auxiliadora", "INF 404"));
fichas.add (new Ficha ("Maria Auxiliadora", "HTM 708"));
fichas.add (new Ficha ("Jose Aparecido", "CMP 101"));
System.out.println ("----- Fichas desordenadas -----");
System.out.println (fichas);
Collections.sort (fichas, new Comparator<Ficha>() {
public int compare (Ficha f1, Ficha f2) {
int c = f1.getNomeAluno().compareToIgnoreCase (f2.getNomeAluno());
if (c != 0) return c;
return f1.getNomeCurso().compareToIgnoreCase (f2.getNomeCurso());
}
});
System.out.println ("----- Fichas ordenadas -----");
System.out.println (fichas);
}
}
Saída esperada:
----- Fichas desordenadas -----
[(Ficha: Jose Aparecido, MAT 400), (Ficha: Abel Adamson, ERR 500), (Ficha: Maria Auxiliadora, ELE 220), (Ficha: Maria Auxiliadora, INF 404), (Ficha:Maria Auxiliadora, HTM 708), (Ficha: Jose Aparecido, CMP 101)]
----- Fichas ordenadas -----
[(Ficha: Abel Adamson, ERR 500), (Ficha: Jose Aparecido, CMP 101), (Ficha: Jose Aparecido, MAT 400), (Ficha: Maria Auxiliadora, ELE 220), (Ficha: Maria Auxiliadora, HTM 708), (Ficha: Maria Auxiliadora, INF 404)]