Ordenação de Listas

20 respostas
R

Pessoal,

Tenho duas listas, uma guarda String outra guarda inteiros

o problema é o seguinte a de numeros eu preciso ordena-la por ordem alfabetica e a de string precisa acompanhar e de inteiros

<%	

List tituloCategorias  = new ArrayList();

List qtdConteudos   = new ArrayList();
tituloCategorias.add(categoria.getTitle());
    qtdConteudos.add(new Integer(qtd));  

Collections.sort(qtdConteudos);
qtdConteudos.get(qtdConteudos.size() - 1);  // Ordena lista em ordem crescente
	
Collections.reverse(qtdConteudos); // Decrescente
%>

<%=tituloCategorias+" ("+qtdConteudos.get(i)+")"%><br/>

Ex:

Agua (35)
Esgoto (47)
Empresa (72)

Quando ordeno a de inteiros em ordem decrescente fica assim

Agua (72)
Esgoto (47)
Empresa (35)

20 Respostas

rsakurai

Sugestão:
Cria um objeto para guardar as informações categoria e qtd, depois vc cria apenas 1 lista com esses objetos e ordena essa lista.

Ficar ordenando 2 listas de modo a ficarem sincronizadas é meio zuado.

M

da uma olhada nos HashMap, vai falicitar um pouco

T

HashMap não pode ser ordenada; você tem de usar um TreeMap ou TreeSet. Veja a documentação.

R

pooo cara ótimaaa ideiaaaa

da uma olhada

class tiposInformacao {

String nome;

int quantidade;		

}
Lista lista = new Lista();

		lista.nome = categoria.getTitle();
		lista.quantidade = new Integer(qtd);
	
    lista.add(tiposInformacao);
rsakurai

Usa as tags de [ code ] … [ /code ] quando vc for postar algum codigo:

Agora vc faz sua classe tiposInformacao (que eu sugiro mudar o nome para TipoInformacao) implementar a interface Comparable.

Depois só utilizar o Collections.sort(lista) para ordena-lo.

R
class Informacao {
			 public static void main(String[] args) {
			 
				 Lista tipoInfo;
				 tipoInfo = new Lista();
			
			 tipoInfo.nome = "primeiro tipo";
			 tipoInfo.quantidade = 1000;
			 
			 List tiposInformacao  = new List();
			 tiposInformacao.add(tipoInfo);
			  
			 }

CARA NÃO ESTOU CONSEGUINDO INSERIR MEU OBJETO NA LISTA =/

ALGUMA IDEIA?

B

List tiposInformacao = new ArrayList();

Instancie um objeto com uma classe concreta :wink:

R
Lista tipoInfo;
		tipoInfo = new Lista();
			
			 tipoInfo.nome = "primeiro tipo";
			 tipoInfo.quantidade = 1000;
			 
			 	List tiposInformacao = new ArrayList();  
			 	tiposInformacao.add(tipoInfo);	  	  
			 
			 	System.out.println(tiposInformacao);

Ele ta me trazendo apenas a posição da memória pessoal!
usei um toString mas continua me trazendo apenas [Lista@19821f] (posição na memória)

???

DirceuSobrinho
Roberto Porto:
Lista tipoInfo;
		tipoInfo = new Lista();
			
			 tipoInfo.nome = "primeiro tipo";
			 tipoInfo.quantidade = 1000;
			 
			 	List tiposInformacao = new ArrayList();  
			 	tiposInformacao.add(tipoInfo);	  	  
			 
			 	System.out.println(tiposInformacao);

Ele ta me trazendo apenas a posição da memória pessoal!
usei um toString mas continua me trazendo apenas [Lista@19821f] (posição na memória)

???

você deve implementar o método toString

Exemplo:
class tiposInformacao {
String nome;
int quantidade;

public String toString(){
   return "nome: "+this.nome + ", Quantidade: "+ quantidade;
}

}
Agora se vc quizer q a lista fica ordenada por ordem alfabetica vc terá q implementar a interface comparable Exemplo:
class tiposInformacao implements Comparable<tiposInformacao>{
String nome;
int quantidade;

public String toString(){
   return "nome: "+this.nome + ", Quantidade: "+ quantidade;
}

public int compareTo(tiposInformacao o) {
   returnthis.nome.compareTo(o.nome);
}

}

Att. Dirceu

R

Poxa cara! Muitooo Obrigadooo rolouu certinhoooo

Mas e se eu quiser usar o CompareTo para organizar por ordem decrescente

ou seja pela quantidade e Não pelo nome???

Desde Já!
muito obrigado Dirceu

rsakurai

Se vc tem mais de uma forma de ordenação, acho mais interessante criar uma classe separada para cada tipo de ordenação e implementar a interface Comparator.

DirceuSobrinho

Para organizar em ordem decrescente, basta multiplicar o resultado por (-1)

Exemplo:

public int compareTo(tiposInformacao o) { return (-1) * this.nome.compareTo(o.nome); }

Para orderna de acordo com a quantidade, é so substituir nome, por quantidade;

exemplo:

public int compareTo(tiposInformacao o) { return (-1) * this.quantidade.compareTo(o.quantidade); }

R

Sim vou fazer isso!

mas em para ordenar pela quantidade em ordem decrescente sigo a mesma linha de raciocinio???

por ordem alfabetica eu ja imaginava como seria

gostaria de saber como é em ordem DECRESCENTE ultilizando compareTo

Obrigado =)

R

OBRIGADOO DIRCEU!!!

ERA O PULO DO GATO QUE FALTAVA PARA MIM!!!

ABRAÇOO PESSOAL

R

public int compareTo(Lista o) { return (-1) * this.quantidade.compareTo(o.quantidade); }

fiz dessa forma! aparentemente rola mas da um erro em

this.quantidade.compareTo(o.quantidade);
B

Roberto Porto:
public int compareTo(Lista o) { return (-1) * this.quantidade.compareTo(o.quantidade); }

fiz dessa forma! aparentemente rola mas da um erro em

this.quantidade.compareTo(o.quantidade);

Que erro? this.quantidade foi inicalizado? Ele é um Integer ou um int?

R

Ele é do tipo int cara!

sim ja foi iniciado mas no momento possui apenas um número!

não sei se tem haver o fato de ter somente um numero e com isso ngm para ele comparar?? =/

DirceuSobrinho

substitua int por Integer

int é um tipo primitivo e logo não possui métodos, então não possui o método compareTo().

Acho se substituir int por Integer funfa blz!

R

CARA NA MOSCA! HEHEHEHE!

FUNCIONOU QUE FOI UMA BELEZAAAA!!!

MUITO OBRIGADO PESSOAL

GRANDE AGRAÇO

B

Se quiser aproveitar ao máximo a linguagem e a API:

import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;

public class TipoInformacao implements Comparable<TipoInformacao>
{
   private String nome;
   private int qtde;
   public static final Comparator<TipoInformacao> ORDENAR_POR_QTDE = new Comparator<TipoInformacao>()
   {
      public int compare(TipoInformacao o1, TipoInformacao o2)
      {
         return o1.qtde - o2.qtde;
      }
   };

   public TipoInformacao(String nome, int qtde)
   {
      if (nome == null)
         throw new IllegalArgumentException("Nome não deve ser nulo.");

      this.nome = nome;
      this.qtde = qtde;
   }

   // Comparações com acento. Obrigado thingol!
   final static Collator collator = Collator.getInstance(new Locale("pt", "BR"));
   static
   {
      collator.setStrength(Collator.PRIMARY); // importante! 
   }

   public int compareTo(TipoInformacao o)
   {
      return collator.compare(this.nome, o.nome);
   }

   @Override
   public String toString()
   {
      return this.nome + " (" + qtde + ")";
   }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main
{
   public static void main(String[] args)
   {
      TipoInformacao agua = new TipoInformacao("Água", 35);
      TipoInformacao esgoto = new TipoInformacao("Esgoto", 47);
      TipoInformacao empresa = new TipoInformacao("Empresa", 72);

      List<TipoInformacao> listaNormal = new ArrayList<TipoInformacao>();
      listaNormal.add(agua);
      listaNormal.add(esgoto);
      listaNormal.add(empresa);

      System.out.println("Ordem normal: " + listaNormal);

      // cria uma nova lista com o conteúdo de outra lista, pois queremos deixar a lista normal quieta
      List<TipoInformacao> listaOrdenadaPorNome = new ArrayList<TipoInformacao>(listaNormal);
      // ordena a lista, alterando ela.
      Collections.sort(listaOrdenadaPorNome);
      System.out.println("Ordem por nome: " + listaOrdenadaPorNome);

      List<TipoInformacao> listaOrdenadaInversamentePorNome = new ArrayList<TipoInformacao>(listaNormal);
      // reverseOrder inverte a ordem
      Collections.sort(listaOrdenadaInversamentePorNome, Collections.reverseOrder());
      System.out.println("Ordem inversa por nome: " + listaOrdenadaInversamentePorNome);

      List<TipoInformacao> listaOrdenadaPorQtde = new ArrayList<TipoInformacao>(listaNormal);
      // aqui ordenamos usando um comparador da classe
      Collections.sort(listaOrdenadaPorQtde, TipoInformacao.ORDENAR_POR_QTDE);
      System.out.println("Ordem inversa por qtde: " + listaOrdenadaPorQtde);

      List<TipoInformacao> listaOrdenadaInversamentePorQtde = new ArrayList<TipoInformacao>(listaNormal);
      // comparador inverso
      Collections.sort(listaOrdenadaInversamentePorQtde, Collections.reverseOrder(TipoInformacao.ORDENAR_POR_QTDE));
      System.out.println("Ordem inversa por qtde: " + listaOrdenadaInversamentePorQtde);
   }
}
Ordem normal: [Água (35), Esgoto (47), Empresa (72)]
Ordem por nome: [Água (35), Empresa (72), Esgoto (47)]
Ordem inversa por nome: [Esgoto (47), Empresa (72), Água (35)]
Ordem inversa por qtde: [Água (35), Esgoto (47), Empresa (72)]
Ordem inversa por qtde: [Empresa (72), Esgoto (47), Água (35)]
Criado 18 de dezembro de 2008
Ultima resposta 18 de dez. de 2008
Respostas 20
Participantes 6