这是我的解决方案,但我不太喜欢它:
var seq1: Seq[String] = Seq("apple", "banana", "camel")
var seq2: Seq[(String, String)] = Seq( "green" -> "fruit", "yellow" -> "fruit", "brown" -> "animal" )
var iter = seq1.toIterator
seq2.map {s => (s._1, s._2, iter.next()) }
答案 0 :(得分:6)
如果你发现自己做了很多这样的事情,Shapeless库提供了一些非常好的方法来处理元组而不放弃类型安全。
例如,您可以使用Shapeless的prepend运算符为元组(+:
)和标准库的zipped
编写以下内容,这样可以避免创建中间集合:
(seq1, seq2).zipped.map(_ +: _)
这是美观的,类型安全的,对于大型集合,它比使用zip
的解决方案更具性能。
当然,您也可以在没有Shapeless的情况下使用zipped
:
(seq1, seq2).zipped.map { case (a, (b, c)) => (a, b, c) }
或者:
(seq1, seq2).zipped.map((a, b) => (a, b._1, b._2))
除了这不构建元组的中间集合这一事实之外,map
这里采用两个参数的函数(而不是元组中的函数)的事实有时会使语法变得有点清洁(如上面的+:
示例中所示)。
答案 1 :(得分:2)
简单:
scala> var seq1 = Seq("apple", "banana", "camel")
seq1: Seq[String] = List(apple, banana, camel)
scala> var seq2 = Seq("green" -> "fruit", "yellow" -> "fruit", "brown" -> "animal")
seq2: Seq[(String, String)] = List((green,fruit), (yellow,fruit), (brown,animal))
scala> seq1 zip seq2 map { case (s1, (s2, s3)) => (s1, s2, s3) }
res1: Seq[(String, String, String)] = List((apple,green,fruit), (banana,yellow,fruit), (camel,brown,animal))
答案 2 :(得分:2)
或者:
seq2 zip seq1 map (x => (x._1._1, x._1._2, x._2))
答案 3 :(得分:0)
seq2 flatZip seq1
res0: org.catch22.collections.immutable.CollSeq3[String,String,String] =
CollSeq((green,fruit,apple),
(yellow,fruit,banana),
(brown,animal,camel))
CollSeq3
是一个仅包含Tuple3 [A,B,C]的集合,它本身就是一个Tuple3 [Seq [A],Seq [B],Seq [C]]。