2012-06-28 26 views

回答

58
val xs = List(1,2,3,4) 
xs zip xs.tail 
    // res1: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 

由於文檔說,zip

返回此列表和其他可迭代的集合形成一個列表 通過成對組合相應的元素。如果其中一個 集合比另一個長,則其餘元素 將被忽略。

所以List('a,'b,'c,'d)拉鍊與List('x,'y,'z)List(('a,'x), ('b,'y), ('c,'z))與第一個被忽略的最終'd

從你的例子中,tailList(1,2,3,4)List(2,3,4),所以你可以看到這些如何將這些拉鍊成對。

+1

這簡短而聰明,但很難理解我的想法。 –

+3

這將是我的簡潔和清晰的首選。有一個upvote。 – Brian

+1

@Luigi:我提出了這個答案,並且更喜歡它到目前被接受的答案,但是解釋會比「如果你認爲這很難理解的LOL更有幫助」。 –

10

要產生對列表(即元組)試試這個

List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList 
+1

使用'map'而不是'collect' - 這將保存一個'isDefinedAt'調用,並且在突然之間拋出一個異常,如果您的原始集合不再是'List',而是靜靜地生成空的結果。出於同樣的原因,你應該模式匹配'Seq(a,b)'而不是'List(a,b)'。 –

6
List(1,2,3,4).sliding(2).map(x => (x.head, x.tail.head)).toList 
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4)) 
+1

這是我寫的時候提出的答案。看起來比其他imo更爲明顯和可讀。 – arviman

+0

@arviman這是我當時想到的。我可能試圖強制使用「滑動」。事後看來,接受的答案要好得多。 – Brian