0 functional-programming scala scala-2.8
我目前有2个列表List('a','b','a')和List(45,65,12),其中第二个列表中的更多元素和元素通过具有键值关系链接到第一个列表中的元素.我希望通过添加相应的值来组合具有相同键的元素,并创建一个看起来像Map('a' - > 57,'b' - > 65)的地图,如57 = 45 + 12.
我目前已将其实施为
val keys = List('a','b','a')
val values = List(45,65,12)
val finalMap:Map(char:Int) =
scala.collection.mutable.Map().withDefaultValue(0)
0 until keys.length map (w => finalMap(keys(w)) += values(w))
Run Code Online (Sandbox Code Playgroud)
我觉得应该有一种更好的方式(功能方式)创建所需的地图而不是我这样做.我怎样才能改进我的代码并以更实用的方式做同样的事情?
val m = keys.zip(values).groupBy(_._1).mapValues(l => l.map(_._2).sum)
Run Code Online (Sandbox Code Playgroud)
编辑:为了解释代码如何工作,zip配对两个输入序列的相应元素,所以
keys.zip(values) = List((a, 45), (b, 65), (a, 12))
Run Code Online (Sandbox Code Playgroud)
现在,您希望将具有相同第一个元素的所有对组合在一起.这可以通过以下方式完成groupBy:
keys.zip(values).groupBy(_._1) = Map((a, List((a, 45), (a, 12))), (b, List((b, 65))))
Run Code Online (Sandbox Code Playgroud)
groupBy 返回一个映射,其键是要分组的类型,其值是输入序列中具有相同键的元素的列表.
此映射的键是字符keys,并且值是来自keys和的关联对的列表values.由于键是输出映射中所需的键,因此您只需要将值转换List[Char, Int]为List[Int].
您可以通过对列表中每对的第二个元素的值求和来完成此操作.
您可以使用map例如从每对中提取值
List((a, 45), (a, 12)).map(_._2) = List(45,12)
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用sum以下方法对
List(45, 12).sum = 57
Run Code Online (Sandbox Code Playgroud)
您可以将此变换应用于地图中的所有值,mapValues以获得所需的结果.