Cada exemplo que encontro é sobre fazer isso alfabeticamente, enquanto eu preciso dos meus elementos classificados por data.
My ArrayList contém objetos nos quais um dos membros de dados é um objeto DateTime. No DateTime, eu posso chamar as funções:
lt() // less-than
lteq() // less-than-or-equal-to
Então, para comparar, eu poderia fazer algo como:
if(myList.get(i).lt(myList.get(j))){
// ...
}
O que devo fazer dentro do bloco if?
Respostas:
Você pode tornar seu objeto comparável:
E então você ordena:
No entanto, às vezes você não deseja alterar seu modelo, como quando deseja classificar em várias propriedades diferentes. Nesse caso, você pode criar um comparador rapidamente:
No entanto, o procedimento acima funciona apenas se você tiver certeza de que dateTime não é nulo no momento da comparação. É aconselhável manipular nulo, além de evitar NullPointerExceptions:
Ou no segundo exemplo:
fonte
Desde o Java 8, a interface List fornece o método de classificação . Combinada com a expressão lambda, a solução mais fácil seria
Classificação inversa
O Java 8 também vem com alguns métodos úteis para classificação inversa.
fonte
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
Você pode usar o método Collections.sort. É um método estático. Você passa a lista e um comparador. Ele usa um algoritmo de fusão modificado sobre a lista. É por isso que você deve passar um comparador para fazer as comparações de pares.
Observe que se myList for de um tipo comparável (aquele que implementa interface comparável) (como Data, Inteiro ou String), você poderá omitir o comparador e a ordem natural será usada.
fonte
A melhor resposta IMHO de Tunaki usando Java 8 lambda
fonte
Dado
MyObject
que tem umDateTime
membro com umgetDateTime()
método, você pode classificar umArrayList
que contémMyObject
elementos pelosDateTime
objetos como este:fonte
Foi assim que resolvi:
Espero que ajude você.
fonte
Com a introdução do Java 1.8, os fluxos são muito úteis para resolver este tipo de problemas:
fonte
Todas as respostas aqui foram consideradas desnecessariamente complexas para um problema simples (pelo menos para um desenvolvedor java experiente, o que não sou). Eu tive um problema semelhante e me deparei com essa (e outras) soluções e, embora elas fornecessem um ponteiro, para um iniciante que encontrei como mencionado acima. Minha solução depende de onde no objeto sua data é, nesse caso, a data é o primeiro elemento do objeto [] em que dataVector é o ArrayList que contém seus objetos.
fonte
DateTime
objeto que está contido dentro de outro objeto. Se fosse apenasDate
ouDateTime
objetos que sãoComparable
não havia necessidade de umComparator
em primeiro lugar.Esta pode ser uma resposta antiga, mas usei alguns exemplos deste post para criar um comparador que classificaria um
ArrayList
deHashMap<String, String>
um objeto na lista, sendo esse o carimbo de data / hora.Eu tenho estes objetos:
Os objetos do mapa são os seguintes:
Esse mapeamento é o que eu uso para carregar todos os meus objetos na lista de matrizes, usando a
alList.add(map)
função, dentro de um loop.Agora, eu criei meu próprio comparador:
Agora posso chamar o Comparador a qualquer momento na matriz e ela classificará minha matriz, fornecendo o carimbo de data / hora mais recente na posição 0 (topo da lista) e o carimbo de data / hora mais antigo no final da lista. Novas postagens são colocadas no topo basicamente.
Isso pode ajudar alguém, e é por isso que eu postei. Leve em consideração as instruções de retorno na função compare (). Existem 3 tipos de resultados. Retornando 0 se forem iguais, retornando> 0 se a primeira data for anterior à segunda data e retornando <0 se a primeira data for posterior à segunda data. Se você deseja que sua lista seja revertida, basta alternar essas duas instruções de retorno! Simples =]
fonte
Passe o argumento ArrayList In.
fonte
Use a abordagem abaixo para identificar as datas de classificação ou não
fonte
SimpleDateFormat
aula desatualizada e notoriamente problemática . Pelo menos não como a primeira opção. E não sem nenhuma reserva. Hoje, temos muito melhorjava.time
, a moderna API de data e hora de Java e suasDateTimeFormatter
.A classe Date já implementa a interface Comparator. Supondo que você tenha a classe abaixo:
Digamos que você tenha uma lista de objetos A
List<A> aList
, você pode classificá-la facilmente com a API de fluxo do Java 8 (snippet abaixo):fonte
Futuros espectadores, acho que essa é a solução mais simples, se o seu modelo contiver uma data do tipo string ("2020-01-01 10:00:00" por exemplo), então escreva a linha a seguir para classificar os dados por data descendente de mais recente para o mais antigo:
fonte