Ordenação por atributos diferentes[Resolvido]

12 respostas
Milk15

Eu criei um tópico faz pouco tempo, mas como o que vou perguntar não tem nada a ver com o outro, e eu preciso tirar essas dúvidas logo então resolvi criar outro tópico :lol:

Eu tenho uma tela, em que tenho que listar um lista de quadrilhas pela ordem alfabética, até aí tudo bem, eu consigo ordenar pela ordem alfabética e tal, mas só que tem outra tela em que a ordenação das quadrilhas tem que ser da que tem maior para menor nota

Resumindo, por um lugar tenho que ordenar por um atributo e por outro tenho que ordenar por outro atributo.

como eu vou fazer isso, se eu fiz Override do compareTo na classe Quadrilha?

Já olhei esses dois tópicos e ainda sim não entendi direito como fazer:
http://javafree.uol.com.br/topic-11827-Ordenacao-de-List-por-campo-especifico.html
http://javafree.uol.com.br/viewtopic.jbb?t=857887
Estou achando que a resposta está na minha frente e não estou vendo.

Se puderem me ajudar, agradeço.

Vlw

12 Respostas

Milk15

pesquisando aqui na Api de Collections, em vez de usar o Collections.sort(List list), acho que ter que usar Collections.sort(List list, Comparator <? super T> c)

mas alguém consegue me explicar como se usa esse?

nel

Oi!

Eu vejo uma solução que seria muito simples.
Cria uma variavél booleana no seu objeto Quadrilha, ela vai indicar de que modo você deve organizar sua lista.

Abraços.

E

Nesse caso vc pode usar a interface Comparator.

Vc pode por exemplo criar uma outra classe que irá implementar Comparator. Nessa classe vc implementa o unico metodo da interface onde vc irá colocar a sua regra de ordenação.

Com essa implementação do Comparator vc pode por exemplo passar para o metodo static sort da classe Collections.sort(lista, comparator).

Vc pode criar quantor comparator quiser uma para cada tipo de ordenação.

Espero ter ajudado

nel

Milk15:
pesquisando aqui na Api de Collections, em vez de usar o Collections.sort(List list), acho que ter que usar Collections.sort(List list, Comparator <? super T> c)

mas alguém consegue me explicar como se usa esse?

Tá, mas calma.
Eu dei a sugestão acima supondo que você implementa a interface Comparator, é esse o seu caso, perfeito?
Seria algo assim:

Collections.sort(suaLista, new Quadrilha());

Supondo que sua classe Quadrilha implementa Comparator.
Abraços.

E

Exemplo de um comparator

public class OrdenaQuadrilha implements Comparator<Quadrilha> {

	@Override
	public int compare(Quadrilha o1, Quadrilha o2) {
		
		// Regra para ordenação
		
		
		return 0;
	}

Perceba que o retorno é um int onde:

retorno positivo indica que o objeto o1 virá antes na ordenação que o objeto o2;

retorno negativo o contrario o2 virá antes na ordenação que o objeto o1;

retorno igual a zero objetos ocupam a mesma posição na ordenação.
Milk15

emersonat:
Exemplo de um comparator

public class OrdenaQuadrilha implements Comparator<Quadrilha> {

	@Override
	public int compare(Quadrilha o1, Quadrilha o2) {
		
		// Regra para ordenação
		
		
		return 0;
	}

Perceba que o retorno é um int onde:

retorno positivo indica que o objeto o1 virá antes na ordenação que o objeto o2;

retorno negativo o contrario o2 virá antes na ordenação que o objeto o1;

retorno igual a zero objetos ocupam a mesma posição na ordenação.

Dúvida 1 : Eu preciso obrigatoriamente criar outro classe ou posso implementar dentro da classe Quadrilha?
Dúvida 2 : Vc poderia exemplificar com seria para duas regras para ordenação? Que é o que realmente quero saber. Porque tá… eu faço um compare para ordenação por nome, mas e depois pra fazer por nota? dou outro override pra compare? É isso que não to entendendo até agora

nel

Oi!

Leu o que eu disse acima?
Veja o que eu disse nos dois comentários acima.

1 - Sim, faça sua classe Quadrila implementar a interface Comparator.
2 - Não, ou você cria um comparator para cada necessidade ou usa de outros meios para conseguir isso, por isso sugeri a variavél booleana, entendeu?

Abraços.

Milk15
nel:
Oi!

Leu o que eu disse acima?
Veja o que eu disse nos dois comentários acima.

1 - Sim, faça sua classe Quadrila implementar a interface Comparator.
2 - Não, ou você cria um comparator para cada necessidade ou usa de outros meios para conseguir isso, por isso sugeri a variavél booleana, entendeu?

Abraços.

hmmm então seria assim?

public class Quadrilha implements Comparator<Quadrilha>{
       boolean regra_ordenacao;   //Se for true por nome, Se for False por nota
       ...
       public int compare (Quadrilha q1, Quadrilha q2){
              if (regra_ordenacao == true){
                          ordene por nome
              }else{
                          ordene por nota
              }
              return 0;

       }
}
nel

Exatamente.

É uma sugestão!
Só me tira o operador "==’ para variavél booleana né amigo…

Faça apenas:

// se for 'true' if(regra_ordenacao) { }

Fica no mínimo mais elegante.
Abraços.

P.s: não esquece de criar o setter e getter para a variavél booleana, para setar seu respectivo valor de acordo com sua necessidade.

Milk15

Hmmm muito obrigado Nel, me ajudou bastante, valeu!

nel

De nada cara.
A idéia era uma solução bem simples, creio que tenha ajudado.

Conseguiu? Se sim, coloque [Resolvido] no seu tópico e se puder, poste o resultado.
Pode haver mais usuários com a mesma dúvida :slight_smile:

Abraços amigo.

Milk15

Consegui sim:
minha solução foi essa

na classe Quadrilha:

Public class Quadrilha implements Comparator <Quadrilha>{
     boolean regra_ordenacao;
    ....
    public void setRegra_ordenacao(boolean regra_ordenacao) {
        this.regra_ordenacao = regra_ordenacao;
    }

@Override      //Sobrescrevendo o método compare, para ordenar ou por nome ou por nota
    public int compare(Quadrilha q1, Quadrilha q2){
        //Se true ordene por nome
        if(regra_ordenacao){
            return q1.getNome().compareTo(q2.getNome());
        }else{ //Se False ordene por nota
            Double nota1 = q1.getNota();
            Double nota2 = q2.getNota();
            return nota1.compareTo(nota2);
        }
    }

}

E na classe que eu vou ordenar:


        Quadrilha q = new Quadrilha();       //instancia apenas pra setar a regra de ordenacao
        q.setRegra_ordenacao(true);
        
        Collections.sort(listaQuadrilhas,q); // Ordena as quadrilhas de A a Z
  
       ou

        q.setRegra_ordenacao(false);
        Collections.sort(listaQuadrilhas,q); // Ordena as quadrilhas da menor para a maior nota
        Collections.reverse(listaQuadrilhas); //Ordena da maior para menor nota
Criado 1 de agosto de 2011
Ultima resposta 1 de ago. de 2011
Respostas 12
Participantes 3