2016-04-30 96 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只保留元素大于平均值。