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
erli 12 feb. 2020 a las 01:51

2 respuestas

La mejor respuesta

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.

1
erli 12 feb. 2020 a las 02:15

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);
}));
0
rzwitserloot 11 feb. 2020 a las 23:24