Ordenar ArrayList de Calendar

Tenho um ArrayList de Calendar e preciso ordená-lo, porem quando utilizo o Collections.sort( List ), ele acusa erro, pois não consegue tratar dados do tipo Calendar.

Existe um método que ordena um Array de Calendar ou pra esse caso específico eu preciso fazer um método de ordenação?

Luiz

Nao testei, mas acho q este resolve seu problema:

[quote]public static void sort(Object[] a,
Comparator c)

Sorts the specified array of objects according to the order induced by the specified comparator. All elements in the array must be mutually comparable by the specified comparator (that is, c.compare(e1, e2) must not throw a ClassCastException for any elements e1 and e2 in the array).

This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.

The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element in the low sublist is less than the lowest element in the high sublist). This algorithm offers guaranteed n*log(n) performance.

Parameters:
    a - the array to be sorted.
    c - the comparator to determine the order of the array. A null value indicates that the elements' natural ordering should be used. 
Throws:
    ClassCastException - if the array contains elements that are not mutually comparable using the specified comparator.
See Also:
    Comparator

[/quote]

Borges, não deu certo, gerou ClassCastException!

Entendi que a classe Calendar precisa implementar o método compare(obj1, obj2) da interface Comparator para funcionar. A Classe original Calendar não implenta Comparator.

O que voce aconselha que eu faça:

  • Elabore um método que ordene Calendar?
  • Crie uma classe que herde de Calendar e implemente Comparator?

Se gerar a classe eu poderei utilizá-la para trabalhar com ordenação de Calendar.

Isso funciona? Essa é a melhor maneira de se fazer?

Luiz

Nao nao…

Acho q vc nao entendeu o metodo…

O 1o. parametro (Object[] a ) sera seu List de Calendars ( seuList.toArray() ) e o 2o. ( Comparator c ) sera uma classe q vc ira criar implementando a interface Comparator.

Dah uma olhadinha na DOC DO COMPARATOR. Eh mole de implementar :wink:

Só uma dica, na classe Collections tem o sort de List direto… E no mesmo esquema do que o aborges postou, com Comparator…

Fallow

[quote=“TedLoprao”]Só uma dica, na classe Collections tem o sort de List direto… E no mesmo esquema do que o aborges postou, com Comparator…

Fallow[/quote]

Boa observacao :wink:

fiz assim!!

criei uma classe que estende de GregorianCalendar e implementei Comparator.

ficou assim:

import java.util.*;

public class MyCalendar extends GregorianCalendar implements Comparator {
    
    public MyCalendar() {
    }
    
    public int compare(Object o1, Object o2) {
        
        Calendar c1 = ( Calendar )o1;
        Calendar c2 = ( Calendar )o2;
        
        int flag = 0;
        
        if( c1.getTimeInMillis() < c2.getTimeInMillis() ) {
            flag = -1;
        } else {
            if( c1.getTimeInMillis() > c2.getTimeInMillis() ) {
                flag = 1;
            }
        }
        
        return flag;
        
    }
    
}

assim eu tenho uma classe do tipo Calendar implementado Comparator.
dessa forma eu posso utilizar diretamente o Collections.sort( List ) para meu array de Calendar que agora será MyCalendar.

assim mesmo?

Naaaaaaoo ! :o

O metodo tem 2 parametros… o 1o. eh seu List e o 2o. eh o Comparator…

public class MeuComparator implements Comparator{ blalblablalbla }

Olha só… eu entendi.

Só que eu fiz uma classe que estende de GregorianCalendar e implementa Comparator. Assim, ao invés de utilizar a classe Calendar ou até mesmo a classe GregorianCalendar (originais) eu utilizo a minha classe, pois nela tem implementado o método compare(obj1, obj2).

ex:

Vamos supor que eu tenha um array de Calendar e quero ordená-lo.

Utilizando a classe que eu fiz, MyCalendar(está postada uns dois tópicos acima), eu posso utilizar o método Collections.sort(List a, Comparator c)

assim:

...
Colections.sort( meuArray, new MyCalendar() );
...

Assim ele irá utilizar o método compare da minha classe.

Outra forma seria utilizar minha própria classe para trabalhar com datas, pois ela estende de GregorianCalendar, e alem do mais ela já implementa Comparator. Dessa forma eu posso utilizar a Collections.sort(List a) direto.

Então ao invés de ter um array de Calendar eu terei um array de MyCalendar. Para ordenar meu array eu faço o seguinte:

...
Colections.sort( meuArray );
...

Eu criei essa classe e utilizei o primeiro método: Collections.sort(meuArray, new MyCalendar)

fazendo assim ficou legal.

o que você acha?

Luiz

Não sei, mas acho q ainda não vale a pena herdar do Calendar, pq vc não faz apenas:

public class MyCalendarComparator implements Comparator { 
    
    public int compare(Object o1, Object o2) { 
        
        Calendar c1 = ( Calendar )o1; 
        Calendar c2 = ( Calendar )o2; 
        
        int flag = 0; 
        
        if( c1.getTimeInMillis() < c2.getTimeInMillis() ) { 
            flag = -1; 
        } else { 
            if( c1.getTimeInMillis() > c2.getTimeInMillis() ) { 
                flag = 1; 
            } 
        } 
        
        return flag; 
        
    } 
    
} 

E o utiliza assim:

Colections.sort( meuArray, new MyCalendarComparator() ); 

Se vc herdar parece que seu comparator faz mais do q realmente precisa fazer…

Fallow

Entendi!!

É que pensei em tornar minha classe mais útil, mais funcional, por isso preferi herdar de GregorianCalendar.

Valew pela ajuda pessoal!!