【问题标题】:How to convert a Seq of tuples into set's of individual elements Scala如何将元组的 Seq 转换为单个元素的集合 Scala
【发布时间】:2019-03-18 06:09:03
【问题描述】:

我们有一个元组序列 Seq(department, title) depTitleSeq 我们想提取 Set(department)Set(title) 寻找迄今为止我们能想出的最佳方法是

val depTitleSeq = getDepTitleTupleSeq()
var departmentSeq = ArrayBuffer[String]()
var titleSeq = ArrayBuffer[String]()
for (depTitle <- depTitleSeq) yield {
  departmentSeq += depTitle._1
  titleSeq += depTitle._2
}

val depSet = departmentSeq.toSet
val titleSet = titleSeq.toSet

对 scala 来说相当新,我相信有更好、更有效的方法来实现这一点,如果你能指出正确的方向,这将有很大帮助

【问题讨论】:

  • 为什么要投反对票?在您投反对票之前,请让用户知道您投反对票的原因,这将有助于改进

标签: scala tuples scala-collections


【解决方案1】:
val result:(Set[String], Set[String]) = depTitleSeq.foldLeft((Set[String](), Set[String]())){(a, b) => (a._1 + b._1, a._2 + b._2) }

您可以使用foldLeft 来实现此目的。

【讨论】:

  • 非常感谢您的回答,但在 >> (Set(), Set()) 处出现语法错误
  • 能否解释一下>> (Set(), Set())处的语法错误
  • @user2359997 这是类型签名
  • 在这种情况下,unzip 肯定比foldLeft 好?
  • @Tim 是的,这样更好
【解决方案2】:
val depTitleSeq = Seq(("x","a"),("y","b"))
val depSet = depTitleSeq.map(_._1).toSet
val titleSet = depTitleSeq.map(_._2).toSet

在 Scala REPL 中:

scala> val depTitleSeq = Seq(("x","a"),("y","b"))
depTitleSeq: Seq[(String, String)] = List((x,a), (y,b))

scala> val depSet = depTitleSeq.map(_._1).toSet
depSet: scala.collection.immutable.Set[String] = Set(x, y)

scala> val titleSet = depTitleSeq.map(_._2).toSet
titleSet: scala.collection.immutable.Set[String] = Set(a, b)

【讨论】:

  • 缺少.toSet
【解决方案3】:

如果您想要将两个 Seqs 数据合并成一个 Seq 元组,您可以将它们一起 zip

如果您有一个 Seq 元组并且您希望将元素分开,那么您可以 unzip 它们。

val (departmentSeq, titleSeq) = getDepTitleTupleSeq().unzip

val depSet   :Set[String] = departmentSeq.toSet
val titleSet :Set[String] = titleSeq.toSet

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2021-06-09
    • 2014-01-27
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多