2012-06-18 113 views
1

对不起,如果它很简单,但什么是在scala中执行以下操作的最有效的方法:斯卡拉集合一对一映射?

说我有两个具有完全相同元素数的集合A和B.例如,

A = {objectA1, objectA2, .... objectAN} 
B = {objectB1, objectB2, .... objectBN} 

我想获得{{objectA1, objectB1}, {objectA2, objectB2}, ... {objectAN, objectBN}}。请注意,这些集合可能非常大。

回答

7

邮编它们:

A zip B 

实施例:

scala> val a = Seq(1, 2, 3, 4, 5) 
a: Seq[Int] = List(1, 2, 3, 4, 5) 

scala> val b = Seq('a', 'b', 'c', 'd', 'e') 
b: Seq[Char] = List(a, b, c, d, e) 

scala> a zip b 
res5: Seq[(Int, Char)] = List((1,a), (2,b), (3,c), (4,d), (5,e)) 

如果AB是迭代器,这将创造对一个迭代为好。

+1

压缩是最简单的方法。如果你需要的元素是序列而不是元组(如你的问题所建议的),你可以做(​​A zip B).map {(a,b)=> List(a,b)} – Heinzi

+1

非常感谢Tomasz和Heinzi ! – Andy

9

@Tomasz的一些补充答案:如果集合非常大,则使用a zip b效率不高,因为它会创建完整的中间集合。还有一种替代方案:

scala> (a,b).zipped 
res15: scala.runtime.Tuple2Zipped[Int,Seq[Int],Char,Seq[Char]] = [email protected] 

scala> (a,b,b).zipped // works also for Tuple3 
res16: scala.runtime.Tuple3Zipped[Int,Seq[Int],Char,Seq[Char],Char,Seq[Char]] = [email protected] 

内部,Tuple2ZippedTuple3Zipped使用迭代器。这使得它更有效率,当你想要变换拉链。