我想要将像List(1,2,3,4)
这样的Scala列表拆分成一对对的形式(1,2) (2,3) (3,4)
,有简单的方法吗?
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
。
通过List(1,2,3,4)
的tail
,可以看到它们是如何成对地配对在一起的,即List(2,3,4)
。
要生成一组二元组(即元组列表),请尝试以下方法
List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList
map
而不是 collect
— 这将避免一次 isDefinedAt
的调用,并且如果突然原始集合不再是 List
,它会抛出一个异常而不是悄悄地产生一个空结果。出于同样的原因,你应该使用模式匹配的 Seq(a,b)
,而不是List(a,b)
。 - Jean-Philippe PelletList(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))
xs
为空时返回一个空列表,则使用xs.zip(xs.drop(1))
,否则您将得到一个UnsupportedOperationException
(由于在空集合上调用tail
而抛出)。 - David