0

我正在尝试在 scala 中列出 2 个给定日期之间的所有日期。这是我写的程序:

object testingscala
{
    def main(args: Array[String]) 
    {
       println(calculateDates(LocalDate.of(2014,1,1), LocalDate.of(2014,2,5)))
    }
    def calculateDates(from: LocalDate, until: LocalDate): List[LocalDate] = 
   {
        var arr = List[LocalDate]()
        var dateList = calculateDatesRecur(from, until) // forward reference extends over definition of variable 
 dateList
        def calculateDatesRecur(from: LocalDate, until: LocalDate): List[LocalDate] =
        {
            if (from.compareTo(until) > 1) {return arr}
            else
            { arr = arr :+ from; calculateDatesRecur(from.plusDays(1), until)}
        }
        return dateList

   }

}

我在 Scala 相对较新,所以我无法弄清楚实施有什么问题。该函数只接受两个参数并打印出两个日期之间的所有日期。我使用了递归。

4

2 回答 2

4

那是因为 Scala 没有数组/列表的文字语法。你必须和

 var arr = List.empty[LocalDate]

或者

 var arr = List[LocalDate]()

不是那个列表不是scala中的数组。

虽然你没有问,但我相信这段代码可以用更简洁的方式编写:

object testingscala extends App
{
    type LD = LocalDate
    println(calculateDatesRecur(LocalDate.of(2014,1,1), LocalDate.of(2014,2,5)))

    @annotation.tailrec
    def calculateDatesRecur(from: LD, until: LD, xs: List[LD] = List.empty[LD]): List[LD] = 
      if (from.compareTo(until) > 1) xs.reverse
      else calculateDatesRecur(from.plusDays(1), until, from::xs)
}

虽然没有测试过。

并回答您的评论:

交换递归函数和 dateList 变量,所以首先定义函数。

...
def calculateDatesRecur(from: LocalDate, until: LocalDate): List[LocalDate] =
{
  if (from.compareTo(until) > 1) {return arr}
  else
  { arr = arr :+ from; calculateDatesRecur(from.plusDays(1), until)}
}
var dateList = calculateDatesRecur(from, until)
...

您正在尝试分配函数结果,但是由于它像嵌套函数一样使用,因此不知道先验,因此编译器不知道要设置什么 dateList (实际上它确实知道,但会阻止您做讨厌的事情)。

于 2013-10-17T16:45:09.250 回答
0

类似于给定一个范围,在 Scala 中获取该范围内的所有日期

简单地用南丫枣(2014, 5, 5) to (2014, 5, 10) foreach println

于 2014-06-11T18:02:08.247 回答