Функция Scala FoldLeft - PullRequest
0 голосов
/ 19 мая 2018

У меня есть данные выборки ниже: День, JD, Месяц, Год, PRCP (в), СНЕГ (в), 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, теперь я вычислил его с помощью reduBy, но не могу понять, как это сделать с помощью 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 в этом? Не могли бы вы помочь?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

foldLeft является более общим reduceLeft (для него не требуется, чтобы результат был супертипом типа коллекции, и он позволяет определить значение, если нечего складывать).Можно реализовать reduceLeft в терминах foldLeft следующим образом:

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 (который тривиально максимален).

0 голосов
/ 19 мая 2018

Может быть, вы ищете что-то вроде этого

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