在Scala中将列表拆分成两个列表

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

如何用函数式的方式实现这个功能?

最好的问候, Sven

2个回答

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

这是一个粗略但有效的方法;实际上,如果您想对这些数据进行更多操作,最好将项目解析为一个 case class,例如:

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)


可以的,非常感谢,我之前不知道有transpose这个函数。不过,你知道有没有一个版本可以在列表上进行并行处理吗? - sveri
lines.par.groupBy... 应该可以解决问题。但对于小列表来说,速度并不一定更快。 - Luigi Plinge

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接