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?
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)
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.
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.
[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.
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.
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
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?
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]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