2012-06-28 24 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