9
votes

Kotlin - liste de tri en utilisant la chaîne de date formatée (fonctionnelle)

J'essaie de créer une API de repos Kotlin, qui récupère des valeurs à partir d'une base de données PostgreSQL. Maintenant, les valeurs de ces résultats sont F.e. "14-10-2016 | 15:48" et "01-08-2015 | 09:29" donc la syntaxe est donc dd-mm-aaaa aaaa | HH: mm

maintenant ce que j'essaie de faire est de créer une fonction qui les commandera par date passée. (Supposons que ces chaînes sont dans une matrice) xxx

Quelle serait la manière la plus propre (et la plus fonctionnelle) de les trier? (SO FE Y a-t-il une manière où je n'ai pas à prendre des sous-chaînes de la journée, du mois, etc. les jeter à un int , comparez-les dans une boucle imbriquée et écrivez les résultats à un autre tableau? (C'est la seule façon dont je pouvais penser).


0 commentaires

4 Réponses :


0
votes

Vous pouvez utiliser DateTimeformatter code> pour analyser, puis comparer avec localDateTime code> xxx pré>

sortie p> xxx Pré>

update strud> p>

Vous pouvez simplement convertir en localDateTime code> dans comparateur code> seul p>

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


2 commentaires

Pas sûr que Kotlin est compatible avec Java 8, mais de toute façon, je suppose que l'OP cherchait une solution écrite à Kotlin.


@Egor désolé, je connais Java seulement mais la logique serait semblable à la réponse que j'ai postée



3
votes

Une autre alternative à l'excellente réponse de Saravana (pour des freaks minimalistes et compacts comme moi ..) est le suivant:

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


1 commentaires

Au lieu d'utiliser mapper pour imprimer, peut-être utiliser list.sortedwith (cmP) .foreach (:: println)



13
votes

Plus d'une approche peut être utilisée. Cela dépend de la manière dont vous traitez après avoir obtenu le résultat trié.

points à noter:

  • java.time.localdateTetime a déjà mis en œuvre Java.Lang.Comparable interface. Nous pouvons utiliser le kotlin stdlib list.sortby pour trier la liste directement.

    ref: xxx

    Le moyen le plus simple est de transformer la chaîne -> java.time.localdateTetime et utilisez le < code> list.sortby directement.

    L'ensemble de la mise en œuvre pourrait être comme ceci: xxx

    Si vous souhaitez utiliser org .joda.time.dateTime , vous pouvez simplement créer un petit changement sur la fonction convert.

    un rappel amical, choisissez toujours val comme votre premier choix à Kotlin :).


2 commentaires

@Elect Les objets immuables sont toujours plus faciles à suivre et peuvent être utilisés dans un environnement fileté mutli sans aucun inquiétude. La plupart du temps, vous n'aurez pas besoin var à Kotlin si vous connaissez une approche fonctionnelle. Mais var est plus efficace de mémoire, utilisez-le judicieusement pour prendre le seul avantage.


L'appel nécessite le niveau d'API 26. Des solutions compatibles en retard?



0
votes

Si vous utilisez une liste de dates d'objet personnalisée triés comme ci-dessous.

println("--- ASC ---")  
dates.sortBy { it.year }
println("--- DESC ---")
dates.sortByDescending { it.year }


0 commentaires