Kotlin – Lista de sorting usando una cadena de date formateada (funcional)

Intento crear una API Kotlin REST, que recupera valores de una database PostgreSQL. Ahora los valores en estos resultados son fe "14-10-2016 | 15:48" y "01-08-2015 | 09:29" Así que la syntax básicamente es dd-MM-yyyy | hh:mm dd-MM-yyyy | hh:mm

Ahora lo que bash hacer es crear una function que los ordere por date de publicación. (Supongamos que estas cadenas están en una matriz)

 var list = listOf("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43") 

¿Cuál sería la forma más limpia (y más funcional) de clasificarlos? (Entonces, ¿hay alguna manera en la que no tenga que tomar subseries del día, mes, etc. para convertirlas a un Int , compararlas en un bucle nested y escribir los resultados en una matriz diferente? (esa es la única manera) Podría pensar).

Se puede usar más de un enfoque. Depende de cómo procese después de get el resultado orderado.

Puntos a tener en count:

  • java.time.LocalDateTime ya implementó la interfaz java.lang.Comparable<T> . Podemos usar kotlin stdlib List.sortBy para orderar la List<LocalDateTime> directamente.

Árbitro:

 // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sorted-by.html fun <T, R : Comparable<R>> Iterable<T>.sortedBy( selector: (T) -> R? ): List<T> 

La forma más fácil es transformar el String -> java.time.LocalDateTime y usar el List.sortBy directamente.

Toda la implementación podría ser así:

  import java.time.LocalDateTime import java.time.format.DateTimeFormatter ... // Create a convert function, String -> LocalDateTime val dateTimeStrToLocalDateTime: (String) -> LocalDateTime = { LocalDateTime.parse(it, DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm")) } val list = listOf("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43") // You will get List<LocalDateTime> sorted in ascending order list.map(dateTimeStrToLocalDateTime).sorted() // You will get List<LocalDateTime> sorted in descending order list.map(dateTimeStrToLocalDateTime).sortedDescending() // You will get List<String> which is sorted in ascending order list.sortedBy(dateTimeStrToLocalDateTime) // You will get List<String> which is sorted in descending order list.sortedByDescending(dateTimeStrToLocalDateTime) 

Si desea utilizar org.joda.time.DateTime , puede hacer un pequeño cambio en la function de conversión.

Un recordatorio amistoso, siempre elige val como tu primera opción en Kotlin :).

Otra alternativa a la excelente respuesta de Saravana (para fanáticos minimalists y compactos como yo …) es:

 val cmp = compareBy<String> { LocalDateTime.parse(it, DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm")) } list.sortedWith(cmp).forEach { ::println } 01-08-2015 | 09:29 14-10-2016 | 15:48 15-11-2016 | 19:43 

Ps: es la variable pnetworkingeterminada para inputs individuales

Puede usar DateTimeFormatter para analizar y luego comparar con LocalDateTime

  List<String> dates = Arrays.asList("14-10-2016 | 15:48", "01-08-2015 | 09:29", "15-11-2016 | 19:43"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy | HH:mm"); List<LocalDateTime> dateTimes = dates.stream().map(date -> LocalDateTime.parse(date, formatter)).sorted().collect(Collectors.toList()); System.out.println(dateTimes); 

Salida

 [2015-08-01T09:29, 2016-10-14T15:48, 2016-11-15T19:43] 

Actualizar

Simplemente puede convertir a LocalDateTime en Comparator solo

 List<String> sortedDates = dates.stream().sorted(Comparator.comparing(date -> LocalDateTime.parse(date, formatter))).collect(Collectors.toList()); 

salida

 [01-08-2015 | 09:29, 14-10-2016 | 15:48, 15-11-2016 | 19:43]