Tengo una serie de nombres de carpetas de cadenas, cada una de las cuales incluye una fecha, hora y zona horaria. La matriz es así:
[
"folder_name_01-18-2020-19_00_00_PM_EST",
"folder_name_05-01-2019-00_00_00_AM_EDT",
"folder_name_12-15-2019-02_00_00_AM_EST"
]
¿Cómo puedo ordenar esta matriz para que todos los nombres de las carpetas se ordenen en orden ascendente por su fecha (más temprana a más reciente), por ejemplo. El resultado de la matriz anterior debería ser este:
[
"folder_name_05-01-2019-00_00_00_AM_EDT",
"folder_name_12-15-2019-02_00_00_AM_EST",
"folder_name_01-18-2020-19_00_00_PM_EST"
]
Se garantiza que las cadenas de nombre de carpeta estarán en este formato exacto. folder_name
nunca cambia, por lo que solo cambiará la marca de tiempo para cada nombre de carpeta.
He pensado en una solución de alto nivel que suena muy ineficiente:
Isolate the datetime from the folder name
Map the datetime to full folder name: {"05-01-2019-00_00_00_AM_EDT":"folder_name_05-01-2019-00_00_00_AM_EDT"}
Add the isolated datetime to an array
Sort the array of datetimes // potential trouble spot b/c of the date format
result = new array()
For item in sorted array:
result.add(map.get(item))
return result
Me pregunto si podrían usarse mejoras y / o mejores métodos para resolver este problema
2 respuestas
Descubrí una solución mucho mejor usando un Comparator
personalizado: tome la fecha y hora con la función substring()
, analícela con SimpleDateTime
, tome el tiempo de época de los objetos Date
resultantes y luego use Long.compare()
para determinar qué hora es más tarde.
Su solución de alto nivel no es particularmente ineficiente. Sin embargo, hay una ruta aún más eficiente:
Arrays.sort(theArray, Comparator.comparing(CALCFUNCTION));
Donde el bit CALCFUNCTION es una función que calcula un valor que se usará para el orden de clasificación. Lo que está buscando es convertir folder_name_01-18-2020-19_00_00_PM_EST
en 20201801190000
, que es fácil de hacer con un expresión regular.
Ejemplo:
private static final Pattern EXTRACTOR = Pattern.compile(
"^.*_(\\d+)-(\\d+)-(\\d+)-(\\d+_\\d+_\\d+)_[AP]M_[A-Z]{1,4}$");
Arrays.sort(theArray, Comparator.comparing(elem -> {
var m = EXTRACTOR.matcher(elem);
if (!m.matches()) return "uhoh. That was unexpected.";
return m.group(3) + m.group(2) + m.group(1) + m.group(4);
}));
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].