我有一个包含以下内容的列表:
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")
我如何以功能性的方式做到这一点?
最诚挚的问候, 斯文
答案 0 :(得分:3)
lines.groupBy(_.split(" -- ")(1)).toList.map(_._2).transpose
这是粗略而且准备好的方式;实际上,如果你想用这些数据做更多的事情,将这些项解析成一个案例类可能会更好,la:
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)
。
答案 1 :(得分: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))