ordenação de lista com mais de um atributo

Olá pessoal,

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)]

Realmente estava colocando o comparador errado, inverti primeiro pelo curso e depois pelo aluno e funcionou o que eu queria…Obrigada pela dica!!!