Как преобразовать Seq кортежей в набор отдельных элементов Scala - PullRequest
0 голосов
/ 13 октября 2018

У нас есть последовательность кортежей 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, я уверен, что есть лучшие и более эффективные способы для достижения этой цели, если вы могли бы указать нам правильное направление, это было бы очень полезно

Ответы [ 3 ]

0 голосов
/ 13 октября 2018
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)
0 голосов
/ 13 октября 2018

Если у вас есть два Seq данных, которые вы хотите объединить в Seq кортежей, вы можете zip их вместе.

Если у вас есть Seq кортежей и выхотите разделить элементы, тогда вы можете unzip их.

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

val depSet   :Set[String] = departmentSeq.toSet
val titleSet :Set[String] = titleSeq.toSet
0 голосов
/ 13 октября 2018
val result:(Set[String], Set[String]) = depTitleSeq.foldLeft((Set[String](), Set[String]())){(a, b) => (a._1 + b._1, a._2 + b._2) }

Вы можете использовать foldLeft для достижения этой цели.

...