scala運算元綜合案例(二)----- 平均溫度的多種實現
阿新 • • 發佈:2019-01-23
交流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