2015-09-04 75 views
3

2個元件我已經手動建立了需要2個陣列然後將它們合併到1這樣的方法:郵編兩個陣列,第一陣列的總是3個元素然後第二

a0,a1,a2,b0,b1,a3,a4,a5,b2,b3,a6,... 

所以我始終以第一個數組的3個元素,然後是第二個數組的2個元素。正如我所說,我手動建立了這個功能。

現在我想我可以用zip來代替它。問題是,僅zip就不夠,因爲zip構建了像(a0, b0)這樣的元組。

我當然可以flatMap這一點,但仍然不是我想要的東西:

val zippedArray: List[Float] = data1.zip(data2).toList.flatMap(t => List(t._1, t._2)) 

這樣,我會得到一個List(a0, b0, a1, b1,...),仍然不是我想要的。 (然後我會使用指定者的列表...它更方便用List現在工作)

我想過用takedrop但他們返回新的數據結構,而不是修改舊的,所以不是我想要的。你可以想象,我並沒有真正進入函數式編程(還)。我確實使用它,並且我看到了巨大的好處,但有些事情與我以前的習慣有很大不同。

回答

4

考慮3分組陣列a和陣列b 2,即

val a = Array(1,2,3,4,5,6) 
val b = Array(11,22,33,44) 

val g = (a.grouped(3) zip b.grouped(2)).toArray 
Array((Array(1, 2, 3),Array(11, 22)), (Array(4, 5, 6),Array(33, 44))) 

然後

g.flatMap { case (x,y) => x ++ y } 
Array(1, 2, 3, 11, 22, 4, 5, 6, 33, 44) 
+0

今天學到了新東西!謝謝 – Zee

2

非常相似的答案@elm但是我想表明,你可以使用更懶方法(迭代器)以避免創建臨時結構:

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

scala> val b = List(11,22,33,44) 
b: List[Int] = List(11, 22, 33, 44) 

scala> val groupped = a.sliding(3, 3) zip b.sliding(2, 2) 
groupped: Iterator[(List[Int], List[Int])] = non-empty iterator 

scala> val result = groupped.flatMap { case (a, b) => a ::: b } 
result: Iterator[Int] = non-empty iterator 

scala> result.toList 
res0: List[Int] = List(1, 2, 3, 11, 22, 4, 5, 6, 33, 44) 

請注意,它一直保持迭代器,直到我們實現它爲止toList

+0

'sliding(n,n)'與'grouped(n)'相同嗎? –

+0

是的,它們是相同的,但'sliding'使迭代器成爲 –

+1

所以'grouped'參見http://www.scala-lang.org/api/current/index.html#[email protected](size:Int ):迭代器[Repr] –

相關問題