スカラーでこの問題に近づく方法を知りたいのですが、fold to doブール・テストの使用方法
開始日と終了日とその間の日付の集合を指定すると、与えられた日付の集合に開始日から終了日までに必要なすべての日付がギャップ日付なしで含まれているかどうかを判断します。
タイプの署名:
def checkDate(start: DateTime, end: DateTime, between: IndexedSeq[DateTime]): Boolean
これを行うには、「正常」か「ない機能」の方法は、このようなものになるだろう:どのように私はフォールドを使用してこれを行うことができます
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
}
?
はここで、これまでの私の思考プロセスです:
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
}
私はちょうどので、私はコレクションの間の上に折り目を反復処理としての価値を高めることができ、インデックスの開始パラメータをする方法を理解する必要があります。それとも、折り畳みが私がまったく使うべきものではない可能性があります。
助けていただけたら幸いです!
、倍は(私見、それは悪い方法です、あなたはさらに処理を停止するために例外をスローすることができますが、)助けにはなりません。あなたは尾の再帰と一緒に行かなければなりません。 @ArtavazdBalayan右。 –
Scalaは非常に「例外」です。私が見て嬉しいのはJavaから継承されたものではありません。 – franklin
'return status'を' status'だけで置き換えることができます。 'return'は、非ローカル終了を行う必要がある場合にのみ必要で、Scalaではめったに使用されません。多くのScalaプログラマは文字通り 'return'を使用しません。 –