Cada ejemplo que encuentro trata de hacerlo alfabéticamente, mientras necesito mis elementos ordenados por fecha.
Mi ArrayList contiene objetos en los que uno de los miembros de datos es un objeto DateTime. En DateTime puedo llamar a las funciones:
lt() // less-than
lteq() // less-than-or-equal-to
Entonces, para comparar, podría hacer algo como:
if(myList.get(i).lt(myList.get(j))){
// ...
}
¿Qué debo hacer dentro del bloque if?
Respuestas:
Puedes hacer que tu objeto sea comparable:
Y luego lo ordena llamando a:
Sin embargo, a veces no desea cambiar su modelo, como cuando desea ordenar varias propiedades diferentes. En ese caso, puede crear un comparador sobre la marcha:
Sin embargo, lo anterior solo funciona si está seguro de que dateTime no es nulo en el momento de la comparación. Es aconsejable manejar nulo también para evitar NullPointerExceptions:
O en el segundo ejemplo:
fuente
Desde Java 8, la interfaz de Lista proporciona el método de clasificación . En combinación con la expresión lambda , la solución más fácil sería
Clasificación inversa
Java 8 también viene con algunos métodos útiles para la clasificación inversa.
fuente
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
Puede usar el método Collections.sort. Es un método estático. Le pasas la lista y un comparador. Utiliza un algoritmo de mergesort modificado sobre la lista. Es por eso que debe pasarle un comparador para hacer las comparaciones de pares.
Tenga en cuenta que si myList es de un tipo comparable (uno que implementa una interfaz comparable) (como Date, Integer o String), puede omitir el comparador y se utilizará el orden natural.
fuente
La mejor respuesta en mi humilde opinión de Tunaki usando Java 8 lambda
fuente
Dado
MyObject
que tiene unDateTime
miembro con ungetDateTime()
método, puede ordenar unoArrayList
que contieneMyObject
elementos por losDateTime
objetos como este:fuente
Así es como lo resolví:
Espero que te ayude.
fuente
Con la introducción de Java 1.8, las transmisiones son muy útiles para resolver este tipo de problemas:
fuente
Todas las respuestas aquí me parecieron innecesariamente complejas para un problema simple (al menos para un desarrollador Java experimentado, que yo no soy). Tuve un problema similar y encontré esta (y otras) soluciones, y aunque proporcionaron un puntero, para un principiante lo encontré como se indicó anteriormente. Mi solución depende de en qué parte del Objeto esté su Fecha, en este caso, la fecha es el primer elemento del Objeto [] donde dataVector es la ArrayList que contiene sus Objetos.
fuente
DateTime
objeto que está contenido dentro de otro objeto. Si era sóloDate
oDateTime
los objetos que se encuentranComparable
no había necesidad de unaComparator
en el primer lugar.Esto puede ser una respuesta de edad pero utilizado algunos ejemplos de este post para crear un comparador que ordenar un
ArrayList
deHashMap<String, String>
por un objeto en la lista, que es la marca de tiempo.Tengo estos objetos:
Los objetos del mapa son los siguientes:
Ese mapeo es lo que uso para cargar todos mis objetos en la lista de la matriz, usando la
alList.add(map)
función, dentro de un bucle.Ahora, creé mi propio comparador:
Ahora puedo llamar al Comparador en cualquier momento en la matriz y ordenará mi matriz, dándome la última marca de tiempo en la posición 0 (parte superior de la lista) y la marca de tiempo más temprana al final de la lista. Las nuevas publicaciones se colocan en la parte superior básicamente.
Esto puede ayudar a alguien, por eso lo publiqué. Tenga en cuenta las declaraciones de devolución dentro de la función compare (). Hay 3 tipos de resultados. Devuelve 0 si son iguales, devuelve> 0 si la primera fecha es anterior a la segunda y devuelve <0 si la primera fecha es posterior a la segunda fecha. Si desea que su lista se invierta, ¡simplemente cambie esas dos declaraciones de devolución! Simple =]
fuente
Pase el argumento ArrayList In.
fuente
Utilice el siguiente enfoque para identificar las fechas ordenadas o no
fuente
SimpleDateFormat
clase desactualizada y notoriamente problemática . Al menos no como la primera opción. Y no sin ninguna reserva. Hoy tenemos mucho mejor enjava.time
la moderna API de fecha y hora de Java y susDateTimeFormatter
.La clase Date ya implementa la interfaz Comparator. Suponiendo que tiene la clase a continuación:
Y supongamos que tiene una lista de objetos A, ya
List<A> aList
que puede ordenarlos fácilmente con la API de transmisión de Java 8 (fragmento a continuación):fuente
Futuros espectadores, creo que esta es la solución más simple, si su modelo contiene una fecha de tipo de cadena ("2020-01-01 10:00:00" por ejemplo), simplemente escriba la siguiente línea para ordenar los datos por fecha descendente de lo más nuevo a lo más antiguo:
fuente