Ordenar uma collection dentro de um Map

8 respostas
E

Galera, no código abaixo eu preciso ordenar a collection por Data, como eu faço ?

Ele está imprimindo assim:

[quote]
Terminal…: 1 Tipo Pagamento …: 0


Data…: 01/01/2008
Data…: 12/10/2007
Data…: 12/10/2007
Data…: 01/01/2008

Terminal…: 2 Tipo Pagamento …: 0


Data…: 25/11/2007
Data…: 25/11/2007

Terminal…: 2 Tipo Pagamento …: 1


Data…: 12/10/2007
Data…: 12/10/2007

private static void getAgrupa() throws ParseException
   {
      Collection<Dado> lista = new Tratador().retornoConsulta();
            
      Map<String, Map<Integer, Collection<Dado>>> agrupamento = new TreeMap<String, Map<Integer, Collection<Dado>>>();

      for (Dado dado : lista)
      {
         Map<Integer, Collection<Dado>> mapaTerminal = agrupamento.get(dado.getTerminal());

         if (mapaTerminal == null)
         {
            mapaTerminal = new TreeMap<Integer, Collection<Dado>>();
            agrupamento.put(dado.getTerminal(), mapaTerminal);
         }

         Collection<Dado> listaData = mapaTerminal.get(dado.getTipoPagamento());

         if (listaData == null)
         {
            listaData = new ArrayList<Dado>();
            mapaTerminal.put(dado.getTipoPagamento(), listaData);
         }

         listaData.add(dado);
      }

  }

8 Respostas

W

aproveitando se alguem souber uma ordenação por chave de HashMap simples eu quero, mas tem que ser pra java 1.4 que nao tem algumas coisas da MapUtils

E

Minha lista eu agrupei todas as datas por Terminal. Porém ao exibi-las estão desordenas. Gostaria de ordena-la em orde crescente.

TreeMap<Integer, Collection<Dado>>ordenaValores = new TreeMap<Integer, Collection<Dado>>();
      
      for(Dado dado : lista)
      {
    	  
    	  Collection<Dado>listaDado = ordenaValores.get(dado.getTipoPagamento());
    	  
    	  if(listaDado == null)
    	  {
    		  listaDado = new ArrayList<Dado>();
    		  ordenaValores.put(dado.getTipoPagamento(), listaDado);    		  
    	  }
    	      	  
    	  listaDado.add(dado);
    	  
      }
Mantu

http://www.guj.com.br/posts/list/45985.java#241201
http://www.guj.com.br/posts/list/54036.java#284273

E

Olha só, eu utilizei o treeset + o comparateTo, ele ordenou, mas agrupou as datas, ou seja, tirou as duplicadas.

for(Dado dado : lista)
      {
    	  
    	  Collection<Dado>listaDado = ordenaValores.get(dado.getTipoPagamento());
    	  
    	  if(listaDado == null)
    	  {
    		  listaDado = new TreeSet<Dado>(); <--------------------------
    		  ordenaValores.put(dado.getTipoPagamento(), listaDado);    		  
    	  }
    	      	  
    	  listaDado.add(dado);
    	  
      }
public int compareTo(Dado o) {
	int compare = this.tipoPagamento.compareTo(o.getTipoPagamento());  
	
	  if (compare != 0)  
	    return compare;  
	
	  return this.data.compareTo(o.getData()); 
}

Como faço para ele não agrupar ?

Mantu

Isso aconteceu porque é da natureza do TreeSet não armazenar registros duplicados. Ele já deixa ordenado, mas não mantém elementos duplicados (Entenda “elementosduplicados” como “elementos em que, ao se aplicar o método compareTo um ao outro, é retornado 0”).
Uma saída tosca seria voçê mudar a implementação do compareTo de tal forma que ele nunca retorne zero, mas acredite: Essa solução é uma m…
O ideal seria você utilizar um outro tipo de coleção ao invéz do TreeSet. Um ArrayList talvez sirva para você. O que me diz?

B

Não use TreeSet então, aliás nenhuma classe que implemente o Set, já que todas elas, por definição, não podem haver elementos duplicados.

Use um ArrayList mesmo, e ordene chamando o Collections.sort(lista);

E

Assim, mas como eu faço para ordenar com arrayList …É possível me dá um exemplo em cima do meu código, porque vi vários na internet e não consegui implementar…

Valeu

E

Galera, muito obrigado mesmo…Consegui conforme vocês me sugeriram…

Um grande abraço !!!

Criado 3 de junho de 2008
Ultima resposta 3 de jun. de 2008
Respostas 8
Participantes 4