我想在Scala中将Seq[Tuple2]和Seq[String]合并为Seq[Tuple3]

我想在Scala中将Seq[Tuple2]和Seq[String]合并为Seq[Tuple3],scala,merge,tuples,seq,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.ne

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

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()) }
简单:

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))
简单:

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))
或:

或:


如果您发现自己在做这类事情,那么库提供了一些非常好的方法来处理元组,而不放弃类型安全性

例如,您可以使用Shapeless的元组前置运算符(
+:
)和标准库的
压缩运算符编写以下内容,这样可以避免创建中间集合:

(seq1, seq2).zipped.map(_ +: _)
这是一款美观、类型安全的产品,对于大型收藏来说,它比使用
zip
的解决方案性能更好

当然,您也可以使用
zipped
而不使用Shapeless:

(seq1, seq2).zipped.map { case (a, (b, c)) => (a, b, c) }
或:


除了不构建元组的中间集合之外,这里的
map
采用两个参数的函数(而不是元组中的函数)有时可以使语法更清晰(如上面的
+:
示例所示).

如果您发现自己在做这类事情,那么库提供了一些非常好的方法来处理元组,而不放弃类型安全性

例如,您可以使用Shapeless的元组前置运算符(
+:
)和标准库的
压缩运算符编写以下内容,这样可以避免创建中间集合:

(seq1, seq2).zipped.map(_ +: _)
这是一款美观、类型安全的产品,对于大型收藏来说,它比使用
zip
的解决方案性能更好

当然,您也可以使用
zipped
而不使用Shapeless:

(seq1, seq2).zipped.map { case (a, (b, c)) => (a, b, c) }
或:

除了不构建元组的中间集合之外,这里的
map
采用两个参数的函数(而不是元组中的函数)有时还可以使语法更清晰(如上面的
+:
示例所示)。

使用

A
CollSeq3
是一个只包含Tuple3[A,B,C]的集合,它本身就是一个Tuple3[Seq[A],Seq[B],Seq[C].

使用


A
CollSeq3
是一个只包含Tuple3[A,B,C]s的集合,它本身就是Tuple3[Seq[A],Seq[B],Seq[C].

请记住:您可能应该使用
val
s而不是
var
s,并且您不需要在这里指出类型。请记住:您可能应该使用
val
s而不是
var
s,您不需要在这里指出类型。