基于内部列表元素值合并List[List[Double]]的技术实现问询
Scala 按时间戳合并测量数据的实现方案
你需要把给定的List[List[Double]]按照时间戳(每个内部列表的第一个元素)合并,把同一时间戳下不同ID对应的测量值整合到同一个列表里对吧?我给你两种实现方式,按需选用:
方式一:用groupBy快速实现(推荐)
这个方法利用Scala集合自带的groupByAPI,代码简洁直观,不用依赖原数据的顺序:
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) ) val mergedData = data .groupBy(_.head) // 以时间戳为键分组所有条目 .toList .sortBy(_._1) // 按时间戳升序排序,保证结果顺序和原数据一致 .map { case (timestamp, entries) => // 按ID排序条目,提取测量值,再把时间戳放在最前面 val sortedValues = entries.sortBy(_(1)).map(_(2)) timestamp :: sortedValues } // 输出结果:List(List(60.0, 3.4, 2.5), List(120.0, 1.1), List(180.0, 5.6, 4.4, 6.7)) println(mergedData)
方式二:补全你写的foldLeft实现
如果你想手动控制合并过程,继续用你已经开始的foldLeft思路,那可以这样补全代码(注意:这个方案要求原数据已经按时间戳排好序,否则同一时间戳的条目会被分到不同组):
val mergedDataWithFoldLeft = data.foldLeft(List[List[Double]]()) { (ret, current) => val timestamp = current.head val value = current(2) ret match { // 第一个条目直接初始化分组 case Nil => List(List(timestamp, value)) case _ => val lastGroup = ret.last if (lastGroup.head == timestamp) { // 时间戳匹配,把当前测量值追加到最后一个分组里 ret.init :+ (lastGroup :+ value) } else { // 时间戳不匹配,新增一个分组 ret :+ List(timestamp, value) } } } println(mergedDataWithFoldLeft)
两种方案都能实现你的需求,groupBy更灵活,不管原数据顺序如何都能正确分组;foldLeft则适合你想一步步手动处理合并逻辑的场景。
内容的提问来源于stack exchange,提问作者awwsmm
相关产品推荐
相关产品推荐

