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