Je voudrais connaître la manière idiomatique d'aborder ce problème dans scala. Déterminer si la collection de dates donnée contient toutes les dates nécessaires pour passer de la date de début à la date de fin sans dates intermédiaires entre une date de début, une date de fin et un ensemble de dates intermédiaires.Comment utiliser fold pour effectuer des tests booléens
signature Type:
def checkDate(start: DateTime, end: DateTime, between: IndexedSeq[DateTime]): Boolean
Le "normal" ou "non fonctionnel" façon de le faire serait quelque chose comme ceci:
def checkDate(start: DateTime, end: DateTime, between: IndexedSeq[DateTime]): Boolean = {
i = 1
status = true
while(start != end) {
d = start.plusDays(i)
if (!between.contains(d) {
status = false
break
}
i += 1
}
return status
}
Comment puis-je faire cela en utilisant un pli ?
Voici mon processus de pensée à ce jour:
def checkDate(start: DateTime, end: DateTime, between: IndexedSeq[DateTime]): Boolean = {
// A fold will assume the dates are in order and move left (or right)
// This means the dates must be sorted.
val sorted = between.sortBy(_.getMillis())
val a = sorted.foldLeft(List[Boolean]) {
(acc, current) => {
// How do I access an iterable version of the start date?
if (current == ??) {
acc :: true
} else false
}
}
// If the foldLeft produced any values that could NOT be matched
// to the between list, then the start date does not have an
// uninterrupted path to the end date.
if (a.count(_ == false) > 0) false
else true
}
J'ai juste besoin de comprendre comment indexer le paramètre de démarrage, je peux augmenter la valeur de celui-ci comme le pli itère sur la entre la collecte. Ou il est possible que le pli ne soit pas du tout ce que je suis supposé utiliser.
Toute aide serait appréciée!
Si vous devez arrêter votre boucle avant de passer par toute la collection, pli ne va pas aider (vous pouvez lancer une exception pour arrêter un traitement ultérieur, mais, à mon humble avis, il est mauvais état). Vous devriez aller avec la récursivité de la queue. –
@ArtavazdBalayan Droite. Scala est très «Exception» adverse; une caractéristique que je suis heureux de voir n'a pas été héritée de Java. – franklin
Vous pouvez remplacer 'return status' avec simplement' status'. 'return' est seulement nécessaire si vous avez besoin de faire une sortie non locale, et est rarement utilisé dans Scala. Beaucoup de programmeurs Scala n'utilisent littéralement jamais 'return'. –