2012-06-18 110 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使用迭代器。這使得它更有效率,當你想要變換拉鍊。