我想将Seq [Tuple2]和Seq [String]合并到Scala中的Seq [Tuple3]

时间:2014-03-07 19:54:19

标签: scala merge tuples seq

这是我的解决方案,但我不太喜欢它:

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()) }

4 个答案:

答案 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)

使用product-collections

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]]。