Scala FoldLeft函数

Scala FoldLeft函数,scala,collections,foldleft,Scala,Collections,Foldleft,我有以下样本数据: Day,JD,Month,Year,PRCP(in),SNOW(in),TAVE (F),TMAX (F),TMIN (F) 1,335,12,1895,0,0,12,26,-2 2,336,12,1895,0,0,-3,11,-16 . . . 现在我需要用maximm TMAX计算最热的一天,现在我用reduceBy计算了它,但无法用foldBy计算,下面是代码: import scala.io.Source case class TempData(da

我有以下样本数据:

Day,JD,Month,Year,PRCP(in),SNOW(in),TAVE (F),TMAX (F),TMIN (F) 
1,335,12,1895,0,0,12,26,-2 
2,336,12,1895,0,0,-3,11,-16 
.
.
.
现在我需要用maximm TMAX计算最热的一天,现在我用reduceBy计算了它,但无法用foldBy计算,下面是代码:

    import scala.io.Source

case class TempData(day:Int , DayOfYear:Int , month:Int , year:Int ,
                    precip:Double , snow:Double , tave:Double, tmax:Double, tmin:Double)
object TempData {
 def main(args:Array[String]) : Unit = {
   val source = Source.fromFile("C:///DataResearch/SparkScala/MN212142_9392.csv.txt")
   val lines = source.getLines().drop(1)
   val data = lines.flatMap { line =>
     val p = line.split(",")
    TempData(p(0).toInt, p(1).toInt, p(2).toInt, p(4).toInt
         , p(5).toDouble, p(6).toDouble, p(7).toDouble, p(8).toDouble, p(9).toDouble))
   }.toArray
   source.close()
   
   val HottestDay = data.maxBy(_.tmax)
   println(s"Hot day 1 is $HottestDay")

   val HottestDay2 = data.reduceLeft((d1, d2) => if (d1.tmax >= d2.tmax) d1 else d2)
   println(s"Hot day 2 is $HottestDay2")

   val HottestDay3 = data.foldLeft(0.0,0.0).....
   println(s"Hot day 3 is $HottestDay3")

我不知道如何在这里使用foldBy函数。

也许您正在寻找类似的东西

data.foldLeft(date(0))((a,b) => if(a.tmax >= b.tmax) a else b)

也许你在找这样的东西

data.foldLeft(date(0))((a,b) => if(a.tmax >= b.tmax) a else b)

foldLeft
是一种更通用的
reduceLeft
(它不要求结果是集合类型的超类型,并且允许在没有可折叠的情况下定义值)。人们可以在
foldLeft
方面实现
reduceLeft
,如下所示:

def reduceLeft[B >: A](op: (B, A) => B): B = {
  if (data.isEmpty) throw new UnsupportedOperationException("empty collection")
  else this.tail.foldLeft(this.head)(op)
}
应用该转换,假设数据不是空的,您就可以进行转换

data.reduceLeft((d1, d2) => if (d1.tmax >= d2.tmax) d1 else d2)
进入


如果数据的大小为1,则data.tail为空,结果为data.head(这是最小值)。

foldLeft
是一种更通用的
reduceLeft
(它不要求结果是集合类型的超类型,并且允许在没有折叠的情况下定义值)。人们可以在
foldLeft
方面实现
reduceLeft
,如下所示:

def reduceLeft[B >: A](op: (B, A) => B): B = {
  if (data.isEmpty) throw new UnsupportedOperationException("empty collection")
  else this.tail.foldLeft(this.head)(op)
}
应用该转换,假设数据不是空的,您就可以进行转换

data.reduceLeft((d1, d2) => if (d1.tmax >= d2.tmax) d1 else d2)
进入


如果数据的大小为1,则data.tail为空,结果为data.head(这只是最大值)。

是的,但我的初始值(其数据类型)应该是什么?为什么选择日期(0)?如果没有数据可折叠,初始值应始终是您想要的结果。所以它需要是折叠的结果类型。是的,确切地说,但是我的初始值(它的数据类型)应该是什么?为什么选择日期(0)?如果没有数据可折叠,初始值应始终是您想要的结果。所以它必须是褶皱的结果类型。