我有以下元组
(a,b) = (String, Set[String])
我希望将其转换为(a,b(1)),(a,(b2))
等数组/列表。
我尝试了一些使用flatMap的方法,总是以b1,b2的列表结尾,但没有(a,某些b)的元组。
由于
答案 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"
填充不等大小的集合。