我有2个案例类
case class First(vt: Long, slots: Seq[Second])
case class Second(index: Int, a: Long, b: Long, c: Long, d: Long)
我有一个Seq如下
Seq(First(200,Seq(Second(2,2,4,2,4), Second(3,1,1,1,1))),
First(100,Seq(Second(2,1,3,1,3), Second(1,1,4,1,4))))
我想从seq上面生成单个案例类,其中 来自First的2个实例的vts的vt max,即max(100,200)即200 下面“第一”中Seq的每个实例都是-(例如,index,min(a),max(b),min(c),max(d))
Seq(Second(2,2,4,2,4), Second(2,1,3,1,3)) -> Second(2,min(2,1),max(4,3),min(2,1),max(4,3))
最终输出应为
First(200, Seq(Second(1,1,4,1,4),Second(2,1,4,1,4),Second(3,1,1,1,1))
答案 0 :(得分:2)
设置
case class Second(index: Int, a: Long, b: Long, c: Long, d: Long)
case class First(vt: Long, slots: Seq[Second])
val seq = Seq(First(200,Seq(Second(2,2,4,2,4), Second(3,1,1,1,1))),
First(100,Seq(Second(2,1,3,1,3), Second(1,1,4,1,4))))
最大vt
val maxFirst = seq.map(_.vt).max
排序,分组,过滤等秒数
val seqOfSecond = seq.map(_.slots).flatten
val groupedSecond = seqOfSecond.groupBy(_.index).toSeq.sortBy(_._1).toMap
// Map(1 -> List(Second(1,1,4,1,4)), 2 -> List(Second(2,2,4,2,4), Second(2,1,3,1,3)), 3 -> List(Second(3,1,1,1,1)))
val groupedSecondFlat = groupedSecond.map {
case (k, v) =>
Second(v.head.index, v.map(_.a).min, v.map(_.b).max, v.map(_.c).min, v.map(_.d).max)
}.toSeq
// List(Second(1,1,4,1,4), Second(2,1,4,1,4), Second(3,1,1,1,1))
将它们组合在一起
First(maxFirst, groupedSecondFlat)
// First(200,List(Second(1,1,4,1,4), Second(2,1,4,1,4), Second(3,1,1,1,1)))
将其添加到外观难看的功能中
def doStuffToFirsts(seq: Seq[First]) = {
val maxFirst = seq.map(_.vt).max
val seqOfSecond = seq.flatMap(_.slots)
val groupedSecond = seqOfSecond.groupBy(_.index).toSeq.sortBy(_._1).toMap.map {
case (k, v) =>
Second(v.head.index, v.map(_.a).min, v.map(_.b).max, v.map(_.c).min, v.map(_.d).max)
}.toSeq
First(maxFirst, groupedSecond)
}