首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala FoldLeft函数

Scala FoldLeft函数
EN

Stack Overflow用户
提问于 2018-05-19 17:32:52
回答 2查看 826关注 0票数 0

我有以下样本数据:

代码语言:javascript
复制
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 
.
.
.

现在我需要计算最大TMAX的最热的一天,现在我已经用reduceBy计算了它,但是我想不出如何用foldBy实现它,下面的代码是:

代码语言:javascript
复制
    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函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-19 18:19:49

foldLeft是一个更通用的reduceLeft (它不要求结果是集合类型的超级类型,如果没有什么可折叠的,它允许定义值)。我们可以像这样用reduceLeft来实现foldLeft

代码语言:javascript
复制
def reduceLeft[B >: A](op: (B, A) => B): B = {
  if (data.isEmpty) throw new UnsupportedOperationException("empty collection")
  else this.tail.foldLeft(this.head)(op)
}

应用该转换,假设数据不是空的,因此可以进行转换。

代码语言:javascript
复制
data.reduceLeft((d1, d2) => if (d1.tmax >= d2.tmax) d1 else d2)

转到

代码语言:javascript
复制
data.tail.foldLeft(data.head) { (d1, d2) =>
  if (d1.tmax >= d2.tmax) d1
  else d2
}

如果数据大小为1,则data.tail为空,结果为data.head (这在很小程度上是最大的)。

票数 1
EN

Stack Overflow用户

发布于 2018-05-19 17:37:38

也许你在找这样的东西

代码语言:javascript
复制
data.foldLeft(date(0))((a,b) => if(a.tmax >= b.tmax) a else b)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50427892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档