Ordenação de coleção com dois ou mais indices

2 respostas
javapaulomg

Olá gostaria de saber se existe como ordenar um coleção de dados por dois indices ou mais…
exemplo:

classe

int codigo
String nome
String endereco

e tenha uma coleção delas, quero ordenar por nome de forma descendente e por codigo de forma ascendente por sem perder a primeiro ordenação… sabem me informar como seria possivel criar algo desta natureza?

2 Respostas

Marcel_Horner

Oi javapaulomg,

Vc tem dois possiveis caminhos para realizar essa ordenacao. Um deles seria a classe Pessoa implementar a interface Comparable e para isso seria necessario criar o metodo compareTo que iria conter a logica de ordenacao que vc deseja. Outro caminho seria implementar um Comparator para a classe pessoa sendo que esse Comparator teria um metodo que receberia dois objetos retornando o resultado da comparacao entre ambos.

Acredito que implementar o Comparator seja mais interessante porque desta forma vc mantem a classe Pessoa mais simples alem de ser possivel implementar mais de um Comparator para que seja possivel realizar a ordenacao de formas diferentes.

Apos implementar o Comparator basta fazer uma chamada ao metodo sort da classe Collection passando o conjunto de dados que vc deseja ordenar e o Comparator a ser utilizado para que o seu conjunto seja ordenado.

Abaixo segue um exemplo do que foi explicado anteriormente:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class TesteOrdena {
    public static void main(String[] args) {
        ArrayList<Pessoa> conj = new ArrayList<Pessoa>();

        Pessoa p1 = new Pessoa(1,"Aaaa","Rua A");
        conj.add(p1);
        p1 = new Pessoa(2,"Bbbb","Rua B");
        conj.add(p1);
        p1 = new Pessoa(5,"Dddd","Rua D");
        conj.add(p1);
        p1 = new Pessoa(3,"Dddd","Rua D");
        conj.add(p1);
        p1 = new Pessoa(4,"Dddd","Rua D");
        conj.add(p1);
        p1 = new Pessoa(7,"Hhhh","Rua H");
        conj.add(p1);
        p1 = new Pessoa(6,"Hhhh","Rua H");
        conj.add(p1);
        p1 = new Pessoa(8,"Zaaa","Rua Z");
        conj.add(p1);
        p1 = new Pessoa(9,"Zzzz","Rua Z");
        conj.add(p1);
        
        for (int i = 0; i < conj.size(); i++) {
            System.out.println("Codigo = "+((Pessoa)conj.get(i)).getCodigo()+
                               " | Nome = "+((Pessoa)conj.get(i)).getNome());
        }
        
        Collections.sort(conj, new PessoaComparator());
        System.out.println("\r\nDepois da ordenação.....\r\n");

        for (int i = 0; i < conj.size(); i++) {
            System.out.println("Codigo = "+((Pessoa)conj.get(i)).getCodigo()+
                               " | Nome = "+((Pessoa)conj.get(i)).getNome());
        }
    }
}

class Pessoa {
    private int codigo;
    private String nome;
    private String endereco;
    
    public Pessoa(int cod, String nom, String end) {
        this.codigo = cod;
        this.nome = nom;
        this.endereco = end;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}

class PessoaComparator implements Comparator {
    public int compare(Object p1, Object p2)
    throws ClassCastException {
        if (!(p1 instanceof Pessoa) || !(p2 instanceof Pessoa))
            throw new ClassCastException("Objetos do tipo Pessoa esperados!");
        
        Pessoa pes1 = (Pessoa)p1;
        Pessoa pes2 = (Pessoa)p2;
        
        int comp = pes1.getNome().compareTo(pes2.getNome());
        if (comp < 0) {
            comp = 1;
        } else if (comp > 0) {
            comp = -1;
        } else {
            if (pes1.getCodigo() == pes2.getCodigo()) {
                comp = 0;
            } else if (pes1.getCodigo() > pes2.getCodigo()) {
                comp = 1;
            } else {
                comp = -1;
            }
        }
        return comp;
    }
}
Acredito que isso resolva o seu problema.
Marcel_Horner

Mais uma coisa, foi vc que criou esse post no Off-topic ou ele foi movido para ca?

Acredito que ele deveria estar em Java Basico…

Criado 8 de agosto de 2006
Ultima resposta 11 de ago. de 2006
Respostas 2
Participantes 2