2016-04-30 95 views
0

我在第一週與Scala一起工作,並正在努力處理用這種語言編寫代碼的方式。計算平均值並從Scala中的列表中移除

我想寫一個函數來確定列表中的平均數,並刪除低於該平均值的值。例如:

我有這樣的名單:

List[(String, Int)] = List(("A", 1), ("B", 1), ("C", 3), ("D", 2), ("E", 4)) 

結果應該是2.2

因此,該函數還應刪除條目("A", 1),("B", 1)("D", 2),因爲它們低於平均值。

任何人都可以幫助我嗎?

回答

3

你可以計算元組列表的第二個元素的平均值,你不需要自己做總和,因爲Scala有一個內置函數。首先,我們需要的元組列表轉換成Int值的列表,我們可以做到這一點使用map功能如下圖所示

val average = list.map(_._2).sum/list.size.toDouble 

現在你有平均,您可以根據其價值

過濾列表,
val newList = list.filter(_._2 < average) 

需要注意的是,我們沒有從列表中刪除任何東西,我們創建了過濾元件

1

你可以這樣做:

val sum = list.map(_._2).sum 
val avg: Double = sum/list.size.toDouble 

val filtered = list.filter(_._2 > avg) 

注意這是兩次遍歷列表,一次總結,一次過濾。另外需要注意的是Scala List[T]是不可變的。當您過濾時,您將使用已過濾的數據創建一個新的List對象。

1
val average = list.map(_._2).sum/list.size.toDouble 
list.filter(p => p._2 >= average) 

您需要CAS新t至Double,否則平均值將轉換爲Int並且不準確。 filter只保留元素大於平均值。