[Résolu] Array, Map, Reduce avec l'élément suivant
Je bloque sur un problème que je visualise bien dans un boucle repeat/while mais que j'aimerais faire plus swifty.
J'ai un tableau ordonné de (from: NSDate, to: NSDate?). Au départ je n'ai que les from. Mais une fois trié j'aimerai que faire un mapping qui permette de remplacer la valeur to par le from de l'élément suivant. Et ne rien faire pour le dernier.
Petit exemple mon tableau de départ (une fois trié) :
[(from: 01/01/16, to: nil),
(from: 02/01/16, to: nil),
(from: 01/04/16, to: nil),
(from: 01/09/16, to: nil)]
J'aimerai obtenir :
[(from: 01/01/16, to: 02/01/16),
(from: 02/01/16, to: 01/04/16),
(from: 01/04/16, to: 01/09/16),
(from: 01/09/16, to: nil)]
Je ne sais pas si c'est clair ? Mais merci d'avance pour votre aide.
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Déjà , je trouve étrange l'énoncé: pourquoi ne pas avoir simplement une liste de dates en entrées ???
Mais voici ce que j'ai produit:
On peut simplifier, mais je manque d'expérience avec Swift. Notamment, je ne connais pas la syntaxe pour passer une fonction anonyme dans le map(), à la place de combinePeriods(). On doit également pouvoir conserver un array immutable au lieu que completePeriods soit mutable. Enfin, définir beginPeriods n'est pas absolument nécessaire, la fonction zip renvoyant une liste dont la longueur est égale à celle de la plus courte des listes.
Je donne ma solution pour l'idée... j'apprends Haskell actuellement.
NSDate contient une méthode "compare". A ta place, je sortirais les date, je les classerai avec les méthodes de comparaisons de NSDate, puis je créerais les chaines de caractère.
https://developer.apple.com/reference/foundation/nsdate
Comme Céroce j'ai utilisé des strings pour les dates, mais en les remplaçant par NSDate le résultat devrait être le même..
Merci à tous pour vos réponses fortement instructives.
Pour info j'ai décris les NSDate dans mon exemple sour la forme jj/mm/aa pour plus de lisibilité mais je souhaite conserver un tableau de NSDate.
zoc et moi utilisons des approches différentes, mais le résultat est le même.
Je ne suis pas certain de laquelle des deux versions est plus la rapide; il faudrait mesurer. A priori je parierais plutôt sur celle de zoc " du moins en Swift " parce que certes, elle utilise une liste mutable, mais elle évite de créer des listes supplémentaires, ce qui provoque des copies en Swift.
Vu le postulat de départ et si ton tableau est un tableau de tuples, un simple for..in devrait suffire non ?
Effectivement je pensai proposer une manière plus orienté programmation fonctionnelle j'ai cependant trouvé que pour cet exemple bien précis ce n'était pas vraiment lisible à côté d'une boucle for..in.
Celant étant dit voici une solution que j'utiliserai (swift 3)
Je découvre grâce à vous la programmation fonctionnelle. Merci! (d'où ma réponse un peu à côté ... )
J'ai lu l'article Wikipedia. Pouvez-vous nous en dire davantage?
Le reduce est une très bonne solution en effet.
J'aurais préféré utilisé map personnellement. Plus intuitif.
J'ai récupéré ce qu'à fait Céroce pour la structure.
Personnellement c'est la fonction enumerated() de array que je ne connaissais pas et qui m'empêchait d'avancer.
Merci à tous. Ce forum est vraiment génial. Je continuerais à le citer dans les remerciements de toutes mes applications car la communauté est au TOP. Chacun apprends et fait découvrir tout en consolidant ses acquis. meeeeerrrrrccccciiiiii.
PS : Je suis en train d'apprendre androà¯de, je ne sais pas s'il existe un forum de cet qualité pour cette plateforme de surcroà®t en français.
Un grand merci à tous pour votre participation à ce sujet.
Voici le code que j'ai finalement utilisé en m'inspirant de vos idées
Voici la sortie de console
Initial array :
From : 2016-01-01 18:22:00 to nil
From : 2016-01-02 02:00:00 to nil
From : 2016-01-04 00:30:00 to nil
From : 2016-01-01 08:22:00 to nil
Sorted array :
From : 2016-01-01 08:22:00 to nil
From : 2016-01-01 18:22:00 to nil
From : 2016-01-02 02:00:00 to nil
From : 2016-01-04 00:30:00 to nil
Mapped array :
From : 2016-01-01 08:22:00 to 2016-01-01 18:22:00
From : 2016-01-01 18:22:00 to 2016-01-02 02:00:00
From : 2016-01-02 02:00:00 to 2016-01-04 00:30:00
From : 2016-01-04 00:30:00 to nil