将Map [String,Seq [Int]]转换为Seq [Seq [Int]]

时间:2016-01-26 03:23:59

标签: scala

我正在尝试转换看起来像这样的数据:

val inputData =
  Seq(("STUDY1", "Follow-up", 1),
    ("STUDY1", "Off Study", 2),
    ("STUDY1", "Screening", 3),
    ("STUDY1", "Treatment", 4),
    ("STUDY2", "Follow-up", 5),
    ("STUDY2", "Off Study", 6),
    ("STUDY2", "Screening", 7),
    ("STUDY2", "Treatment", 8));

看起来像这样的数据:

val desiredData =
  Seq(Seq(1,2,3,4),
    Seq(5,6,7,8));

我得到的最接近的是:

val result: Map[String, Seq[Int]] =
  data.groupBy(i => i._1)
    .mapValues(j => j.map(k => k._3))
    .mapValues(_.toArray)

result.values.toSeq

这会产生:

res0: Seq[Seq[Int]] = Stream(WrappedArray(1, 2, 3, 4), ?)

最后一个问号让我陷入困境。

修改 落在这里的未来互联网旅行者:我的代码实际上做了工作......我的困惑源于了解?的全部内容。来自下面的人的答案帮助我看到mapValues进行了懒惰的评估,而?只是暗示了这一点。

2 个答案:

答案 0 :(得分:5)

mapValues上的{p> Map是懒惰的(与默认Map上的任何其他方法不同)。那可能是那里的问题。你试过了吗?

data.groupBy(_._1).map(_._2.map(_._3).toArray)

请注意,此处toArray完全是可选的。

答案 1 :(得分:3)

val result: List[Seq[Int]] =
  data.groupBy(_._1).mapValues(_.map(_._3)).values.toList
相关问题