用集合展平scala元组

时间:2015-05-05 15:25:48

标签: scala

我有以下元组

(a,b) = (String, Set[String])我希望将其转换为(a,b(1)),(a,(b2))等数组/列表。

我尝试了一些使用flatMap的方法,总是以b1,b2的列表结尾,但没有(a,某些b)的元组。

由于

3 个答案:

答案 0 :(得分:2)

另一种变体,只是直接映射到Set:

scala> val t = ("x", Set("a","b","c"))

scala> t._2.map((t._1, _))

res1: scala.collection.immutable.Set[(java.lang.String, java.lang.String)] 
      = Set((x,a), (x,b), (x,c))

在实际代码中,我可能会按照以下方式执行此操作,以避免所有_1_2丑陋,例如:

t match {case (a,b) => b.map((a, _))}

(如果您确实需要List而不是Set作为最终输出,则在其中任何一个的末尾添加toList

答案 1 :(得分:1)

scala> val (a, b) = ("hello", Set(1, 2, 3))
a: String = hello
b: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> b.to[List].map(e => (a, e))
res0: List[(String, Int)] = List((hello,1), (hello,2), (hello,3))

请记住,Set不会保留订单。

编辑(转换中的用法):

scala> case class Movie(i: String, g: Set[String], t: String, y: String)

defined class Movie

scala> val movies = List(Movie("a", Set("a", "b", "c"), "a", "a"), Movie("b", Set("d", "e", "f"), "b", "b"))

movies: List[Movie] = List(Movie(a,Set(a, b, c),a,a), Movie(b,Set(d, e, f),b,b))

scala> movies.map{case Movie(i, g, t, y) => (t, g.to[List])}.map{case (str, list) => list.map(e => (str, e))}
res1: List[List[(String, String)]] = List(List((a,a), (a,b), (a,c)), List((b,d), (b,e), (b,f)))

答案 2 :(得分:1)

for comprehension为这种情况提供了一个简洁的语法;让

val (k,s) = ("z", Set("a","b","c"))

for (v <- s) yield (k,v)

还要考虑这样的zipAll

k.zipAll(s,"z","z")

其中字符串k被视为序列,我们用"z"填充不等大小的集合。