Scala FoldLeft 函数
Scala FoldLeft function
我有以下示例数据:
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 来计算下面的代码:
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)
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)
进入
data.tail.foldLeft(data.head) { (d1, d2) =>
if (d1.tmax >= d2.tmax) d1
else d2
}
如果数据的大小为 1,则 data.tail 为空,结果为 data.head(这通常是最大值)。
我有以下示例数据:
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 来计算下面的代码:
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)
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)
进入
data.tail.foldLeft(data.head) { (d1, d2) =>
if (d1.tmax >= d2.tmax) d1
else d2
}
如果数据的大小为 1,则 data.tail 为空,结果为 data.head(这通常是最大值)。