3

我有一个包含以下内容的列表:

val lines: List[String] = List("bla blub -- id_1", "sdkfjdf -- id_2", "blubber blab -- id_1", "foo -- id_3", "ieriuer -- id_2", "bar -- id_3")

所以基本上该列表包含一个恰好存在两次的标识符(id_x)和一个属于其中一个标识符的字符串。

我想将该列表拆分为两个列表,然后每个列表都包含一组唯一的 id_s 及其所属的字符串,如下所示:

l1("bla blub -- id_1", "sdkfjdf -- id_2", "foo -- id_3") 
l2("blubber blab -- id_1", "ieriuer -- id_2", "bar -- id_3")

我将如何以实用的方式做到这一点?

最好的问候, 斯文

4

2 回答 2

3
lines.groupBy(_.split(" -- ")(1)).toList.map(_._2).transpose

这是粗略且现成的方法。实际上,如果您想对这些数据做更多的事情,最好将这些项目解析为案例类,例如:

case class Item(id: String, text: String)
val items = for {
  line <- lines
  Array(text, id) = line.split(" -- ")
} yield Item(id, text)

然后像上面一样做,除了groupBy(_.id), 也很方便sortBy(_.id)

于 2013-08-07T22:43:55.283 回答
1

这个解决方案怎么样?

lines.groupBy(_.takeRight(3)).map(_._2).foldLeft((List.empty[String], List.empty[String])) { 
  (acc, elem) => elem match {
    case left :: right :: Nil =>
      (left :: acc._1, right :: acc._2)
    case Nil => acc
  }
}

res2: (List[String], List[String]) = (List(bla blub -- id_1, sdkfjdf -- id_2, foo -- id_3),List(blubber blab -- id_1, ieriuer -- id_2, bar -- id_3))
于 2013-08-07T22:24:54.463 回答