Scala:从列表生成元组

3

我有一个列表val l=List(4,3,2,1),我想生成一个元组列表,格式为(4,3), (4,2)等等。

这是我目前拥有的:

for (i1<-0 to l.length-1;i2<-i1+1 to l.length-1) yield (l(i1),l(i2))

输出结果是:Vector((4,3), (4,2), (4,1), (3,2), (3,1), (2,1))

以下是两个问题:

  1. 它生成了一个Vector,而不是List。它们有什么不同?

  2. 这是使用scala语言惯用方式吗?我非常新手Scala,所以学习正确很重要。

答案:
  1. VectorList在实现方面有所不同。具体来说,VectorList更适合随机访问和更新,而List则更适合头部的插入和删除操作。

  2. 是的,这是使用Scala的惯用方式。你的代码已经足够简洁和优雅,没有必要进行修改。

1个回答

6
在第一个问题的部分,for循环实现定义范围为0到l.length-1i1+1到l.length-1作为IndexedSeq[Int],因此产生的类型是trait IndexedSeq[(Int, Int)],由final class Vector实现。
在第二个问题上,您的方法是有效的,但考虑以下情况,我们不使用列表的索引引用:
for (List(a,b,_*) <- xs.combinations(2).toList) yield (a,b)

注意,
xs.combinations(2).toList
List(List(4, 3), List(4, 2), List(4, 1), List(3, 2), List(3, 1), List(2, 1))

因此,对于List(a,b,_*),我们可以进行模式匹配并提取每个嵌套列表的前两个元素(_*表示忽略可能存在的额外元素)。由于迭代是在列表上进行的,因此for循环会产生一个包含多个二元组的列表。


谢谢,你使用List(a,b,_*)而不是只用List(a,b)有什么原因吗? - rivu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接