从案例类的Seq生成单个案例类

时间:2018-12-13 17:04:30

标签: scala

我有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))

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)
}