1. 程式人生 > >scala運算元綜合案例(二)----- 平均溫度的多種實現

scala運算元綜合案例(二)----- 平均溫度的多種實現

交流QQ: 824203453

給定資料,城市和溫度的資料, 求每個城市的平均溫度值。

資料如下:

val d1 = Array(("bj", 28.1), ("sh", 28.7), ("gz", 32.0), ("sz", 33.1))
val d2 = Array(("bj", 27.3), ("sh", 30.1), ("gz", 33.3))
val d3 = Array(("bj", 28.2), ("sh", 29.1), ("gz", 32.0), ("sz", 30.5))

思路:

1,對資料進行合併

2,按照城市進行分組

3,分組後進行聚合統計

1,對資料進行合併的實現: 

使用 ++ 或者 union

    val data: Array[(String, Double)] = d1 ++ d2 ++ d3
   //  val data =  d1 union d2 union d3

2,按照城市進行分組

val grouped: Map[String, Array[(String, Double)]] = data.groupBy(_._1)

聚合實現方式一:

利用mapvalues運算元,分別統計總的溫度,以及月份的次數,然後求得平均溫度

    val result = grouped.mapValues(t => {
      val totalSum = t.map(_._2).sum
      val len = t.length
      totalSum / len
    })

 result.foreach(println)

聚合實現方式二:

利用foldLeft來實現,需要注意的是,因為初始值型別是Double,而元素型別是元組型別,所以這裡不能用fold實現

    grouped.mapValues(t=>{
      val sum = t.foldLeft(0d)(_+_._2)
      sum / t.length
    })
//      .foreach(println)

聚合實現方式三:

利用reduce或者reduceLeft 實現。因為reduce和reduceLeft的特性,這裡的元素是元組型別,要求返回值型別也得是元組型別。所以,需要組裝成元組,再取第二個元素。即為溫度總值。然後再除以長度,得到結果值。

    grouped.mapValues(t=>{
      t.reduceLeft((a,b)=>("",a._2 + b._2))._2 / t.length
    })
      .foreach(println)

聚合實現方式四:

利用aggregate實現。同樣需要傳遞一個Double型別的初始值,然後進行統計計算。

    grouped.mapValues(t=>{
      t.aggregate(0d)(_+_._2,_+_) / t.length
    })

結果值:

(gz,32.43333333333333)
(bj,27.86666666666667)
(sz,31.8)

(sh,29.3)

交流QQ: 824203453