如何在scala中对列表中的项目进行分组

时间:2015-01-27 13:07:00

标签: scala

val x1 = List(
                        c1(1, ("UTC",List(c2("2014 - 11 - 23", 0.8747f)))),
                        c1(2, ("UTC", List(c2("2014 - 11 - 23", 0.0f)))),
                        c1(1, ("EST", List(c2("2014 - 09 - 01", 0.432f)))),
                        c1(3, ("EST", List(c2("2014 - 09 - 01", 4.1043f))))
                    )

现在我希望我的列表按ID分组,如下所示

val x2 = List(
c1(1, ("UTC", List(c2("2014 - 11 - 23", 0.8747f)), ("EST", List(c2("2014 - 09 - 01", 0.432f)))),
c1(2, ("UTC", List(c2("2014 - 11 - 23", 0.0f)))),    
c1(3, ("EST", List(c2("2014 - 09 - 01", 4.1043f)))))
)

因此id = 1的所有列表都被分组到一个列表中。

P.S。 c1和c2是用于保存数据的案例类。

3 个答案:

答案 0 :(得分:0)

除非我弄错了,否则你正在寻找List.groupBy

x1.groupBy(_.id)

答案 1 :(得分:0)

我想这就是你要找的东西。

case class c1(id:Int, list:List[String])
object Tester extends App{

  val x = List(c1(1, List("a","b")), c1(2, List("x","y")), c1(1,List("t","w")), c1(4, List("g","j")))
  val y = x.groupBy(_.id)
  println(y)
}

答案 2 :(得分:0)

可能是这样的:

  case class c1(id: Int, data: (String, List[c2])*)
  case class c2(d: String, v: Float)

  val x2 = x1.groupBy(_.id).map(g => c1(g._1, g._2.flatMap(y => y.data): _*))
  println(x2)

  //  List(
  //      c1(2,List((UTC,List(c2(2014 - 11 - 23,0.0))))), 
  //      c1(1,List((UTC,List(c2(2014 - 11 - 23,0.8747))), 
  //                (EST,List(c2(2014 - 09 - 01,0.432))))), 
  //      c1(3,List((EST,List(c2(2014 - 09 - 01,4.1043))))))