scala-collections - Scala:如何对不同长度列表中具有相同索引的所有元素求和?
问题描述
我有一个整数列表列表。需要获取列中所有元素的总和列表,从右到左,如果列中的值不存在(一行比其他行短),则设为 0:
( 1, 7),
( 3, 4, 6, 0),
(),
( 9, 1, 6, 7, 2),
...
---------------------
( 9, 4, 10, 14, 9)
我是用 Java 写的(比如说,一种命令式语言):
int[][] s = {
{ 1, 7 },
{ 3, 4, 6, 0 },
{},
{ 9, 1, 6, 7, 2 }
};
int maxLen = 0;
for (int[] x : s) {
maxLen = Integer.max(maxLen, x.length);
}
int[] sum = new int[maxLen];
for (int j = maxLen; j-- > 0; ) {
for (int[] i : s) {
int idxFromEnd = j - maxLen + i.length;
sum[j] += idxFromEnd >= 0 ? i[idxFromEnd] : 0;
}
}
然后翻译成Scala:
val s = List(
List( 1, 7 ),
List( 3, 4, 6, 0 ),
List(),
List( 9, 1, 6, 7, 2 ),
)
val maxLen = s.view.map(_.length).max
val sum =
for (i <- 0 until maxLen)
yield s.view.map(row => {
val idxFromEnd = i - maxLen + row.length
row.lift(idxFromEnd).getOrElse(0)
}).sum
请你们建议一种用 Scala 编写它的惯用方式。尾递归也是可以接受的。
解决方案
您可以使用groupBy
和flatMap
:
val s = List(
List( 1, 7 ),
List( 3, 4, 6, 0 ),
List(),
List( 9, 1, 6, 7, 2 ),
)
s.flatMap(_.zipWithIndex).groupBy{case (num, idx) => idx}
.map{case (k, v) => v.map(_._1).sum}.toList
推荐阅读
- mongodb - 为 MongoDB 创建 2dIndex
- json - org.hibernate.PropertyAccessException:无法设置字段值
- javascript - 点符号对象到多维对象
- hugo - Hugo“观看时出错:readEvents() 中的短读” - 不必要的页面刷新
- python - 带有扩展名的python方法移动
- angular - 业力和茉莉花:如何在构造函数中使用@Inject InjectionToken 测试组件
- java - Java 中的消费者是什么?
- python - 遍历excel的不同选项卡,提取数据并放入数据框
- git - git push 失败 - 致命:远程端意外挂断
- vue.js - BootstrapVue - 数字表单输入在 Firefox 中不起作用