Ordenar ArrayList

7 respostas
L

Boa tarde pessoal, preciso ordenar um arraylist pelo número de lampadas de um cômodo.

Criei uma interface, e nela tenho:
private ArrayList<Imovel> imoveis = new ArrayList();
depois imprimo este arraylist:

areaRelatorio.setText("Relatório:"); for (Imovel imovel : imoveis) { areaRelatorio.append("\n" + imovel.listar());
Dentro deste arraylist, tem um outro arraylist de comodo, que está implementado em um classe chamada Imovel:

public class Imovel { protected ArrayList<Comodo> comodos = new ArrayList(); public void addComodo(Comodo c) { comodos.add(c); } }
E tenho a classe comodo:

public class Comodo { private int lampadas; public int calcLampadas() { return lampadas; } }
Quer dizer, eu cadastro os dados de um imovel, e guardo em um arraylist, depois cadastro os comodos para este imovel, e guardo o comodo em um arraylist dentro do imovel selecionado.

Seguindo os cadastros, faço a impressão na tela dos dados cadastrados;
Um imovel terá varios comodos, porém na hora de imprimir os comodos, tem que vir em ordem decrescente de número de lampadas.
Isto é, eu cadastro em comodo o numero de lampadas que este vai ter.

A questão é, quando mando imprimir o arraylist de imoveis, vai ser imprimido pela ordem de cadastro.
Como faço pra ordenar o arraylist por comodo pela ordem decrescente do numero de lampadas.

Sei que tenho usar Collections.sort( arraylist, ComparatorTo, mas não to conseguindo implementar esse comparador, tem alguma outra forma?
Já pesquisei em vários tópicos, mas não entendi como implementar no meu caso, que tenho dois arraylist.

Se puderem me dar um help, uma dica ou um caminho. Agradeço.

PS.: Tentei simplificar pois o código é grande.

7 Respostas

luciano2

Cria uma classe de comparação implementando a interface Compartor.

implementa o método compare com sua regra de ordenação por lâmpada

o método compare recebe dois objetos e retorna um int , para ordenar sua lista de cômodos seriam passados dois objetos Comodo

ai se o número de cômodos do primeiro for menor do que o segundo você retorna -1, se for igual vc retorna 0 e se for maior você retorna 1

depois é só usar o método Collections.sort

passando sua lista e seu comparator.

ViniGodoy

Para mais detalhes, leia esse tópico:
http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

L

Tentei implementar, mas não deu certo:

Acontece seguinte, tenho a classe Comodo, que tem o metodo pra calcular as lampadas deste comodo.
Tenho a classe Imovel, que tem um arraylist da classe comodo, pra add o comodo cadastrado a este imovel.
E na interface, eu tenho um arraylist de Imovel, pra poder cadadastrar vários imoveis.

Implementei o Compare (talvez de forma errada), pois o arraylist esta na classe Imovel, e o metodo está na classe Comodo. Mesmo que faço agregação de comodo na classe Imovel não deu certo.
Não sei se conseguiram entender o meu problema, mas o caso está pelo fato de ter um arraylist dentro de outro.
Conseguem me dar uma luz?
obrigado.

public class CompareTo implements Comparator {
     
        public int compare(Object obj1, Object obj2) {  
            int retorno = 0;  
            if(obj1 == null || obj2 == null)  
                return retorno;  
              
            Comodo objeto1 = (Comodo) obj1;  
            Comodo objeto2 = (Comodo) obj2;  
          
            if(objeto1.calcLampadas() > objeto2.calcLampadas()) {  
                retorno = 1;  
            } else if(objeto1.calcLampadas()== objeto2.calcLampadas()){  
                retorno = 0;  
            } else {  
                retorno = -1;  
            }  
             return retorno;  
        }  
    }
ViniGodoy

Ops. Desculpe, coloquei o link errado. O certo era:
http://www.guj.com.br/java/54036-comparator#284273

Seu Comparator está quase certo:

public class CompareTo implements Comparator&lt;Comodo&gt; { @Override public int compare(Comodo obj1, Comodo obj2) { if(obj1 == null || obj2 == null) return 0; return objeto1.calcLampadas() - objeto2.calcLampadas(); } }

E na hora de ordenar:

Você quer classificar a lista de imoveis ou de comodos? Pq se for de imóveis, precisará fazer um Comparator

L

ViniGodoy:


Você quer classificar a lista de imoveis ou de comodos? Pq se for de imóveis, precisará fazer um Comparator<Imovel>

Quero classificar a lista de comodos, da forma que você posto, vou tentar.

L

Seguinte, deu certo :D

mto obrigado mesmo.

So preciso de um seguinte detalhe, de tal forma, a lista fico ordenada por ordem crescente.
Quero que fique ordenada decrescente.
Eu troquei o sinal de - por +, mas nao deu certo, como posso fazer para trazer de forma decrescente?
A minha lógica agora falhou,
mas desde já agradeço mto.

Teria alguma forma de fazer dentro do CompareTo, sem ter que usar

Collections.reverse
public class CompareTo implements Comparator<Comodo> {
     
        public int compare(Comodo obj1, Comodo obj2) {    
            if(obj1 == null || obj2 == null)    
                return 0;    
            return (int) (obj1.calcLampadas() + obj2.calcLampadas());  
        }
ViniGodoy

Inverta a ordem da subtração:

public class CompareTo implements Comparator&lt;Comodo&gt; { @Override public int compare(Comodo obj1, Comodo obj2) { if(obj1 == null || obj2 == null) return 0; return objeto2.calcLampadas() - objeto1.calcLampadas(); } }

Criado 6 de junho de 2011
Ultima resposta 6 de jun. de 2011
Respostas 7
Participantes 3