【发布时间】:2018-03-21 15:10:19
【问题描述】:
我想根据内部列表中元素的值合并List[List[Double]]。到目前为止,这是我所拥有的:
// inner Lists are (timestamp, ID, measurement)
val data = List(List(60, 0, 3.4), List(60, 1, 2.5), List(120, 0, 1.1),
List(180, 0, 5.6), List(180, 1, 4.4), List(180, 2, 6.7))
data
.foldLeft(List[List[Double]]())(
(ret, ll) =>
// if this is the first list, just add it to the return val
if (ret.isEmpty){
List(ll)
// if the timestamps match, add a new (ID, measurement) pair to this inner list
} else if (ret(0)(0) == ll(0)){
{{ret(0) :+ ll(1)} :+ ll(2)} :: ret.drop(1)
// if this is a new timestamp, add it to the beginning of the return val
} else {
ll :: ret
}
)
这行得通,但它对我来说并不是最佳选择(尤其是右侧添加“:+”)。对于我的用例,我有一个相当大的(约 25,000 个内部列表)元素列表,它们本身都是长度为 3 的列表。最多会有四重退化,因为内部列表是List(timestamp, ID, measurement) 组,并且只有四个唯一ID。本质上,我想将所有具有相同时间戳的测量值混合在一起。
有没有人看到更优化的方法?
如果有更好的方法从那一点开始的话,我实际上是从时间戳List[Double] 和四个 ID 中的每一个的测量值 List[Double] 开始的。
【问题讨论】:
-
我不太明白。你到底想达到什么目的?您“想要合并”并且“想要弄脏”,并且在整个代码中散布了一些精美的 cmets,但是仍然不清楚最终目标是什么。最后你真的想要
(time, id, meas, id, meas, id, meas, ...)-lists 吗?为什么你想把它做成这么尴尬的格式,为什么不把它正确地建模成Map[Timestamp, Map[Id, Measurement]]之类的? -
是的,我想在最后列出
(time, id, meas, id, meas, id, meas, ...)。这样,它可以很容易地写入 CSV,并在必要时重新解析。 -
如果您的输入时间戳有问题会怎样?
-
@Tom 他们不是,因为我在做任何这些之前都会对列表进行排序
-
在这种情况下,我会使用下面提供的
groupBy解决方案,您不需要事先进行排序,如果您的列表很大,这将有所帮助。
标签: scala list functional-programming stream