Ordenação por atributos diferentes[Resolvido]

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

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?

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.

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

[quote=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?[/quote]

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.

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.

[quote=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.

[/quote]

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

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.

[quote=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.[/quote]

hmmm então seria assim?

[code]public class Quadrilha implements Comparator{
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;

   }

}[/code]

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.

Hmmm muito obrigado Nel, me ajudou bastante, valeu!

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.

Consegui sim:
minha solução foi essa

na classe Quadrilha:

[code]Public class Quadrilha implements Comparator {
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

[/code]