你如何将Scala列表变成对?

Gar*_*all 31 scala

我试图将Scala列表List(1,2,3,4)分成两对(1,2) (2,3) (3,4),这是一种简单的方法吗?

Lui*_*hys 72

val xs = List(1,2,3,4)
xs zip xs.tail
  // res1: List[(Int, Int)] = List((1,2), (2,3), (3,4))
Run Code Online (Sandbox Code Playgroud)

正如文档所说, 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),所以你可以看到这些拉链一起成对.

  • 这将是我简洁明了的首选.有一个upvote. (3认同)
  • 这是简短而聪明的,但是我认为很难理解。 (2认同)

Jak*_*sky 13

要生成对列表(即元组),请尝试此操作

List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList
Run Code Online (Sandbox Code Playgroud)

  • 使用`map`代替`collect`——这将节省一个`isDefinedAt`调用并在突然你的原始集合不再是`List`时抛出异常,而不是默默地产生一个空结果。出于同样的原因,您可能应该模式匹配 `Seq(a,b)` 而不是 `List(a,b)`。 (2认同)

Bri*_*ian 7

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))
Run Code Online (Sandbox Code Playgroud)