我有一个列表 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))
两个问题:
它生成一个
Vector
, 不是List
.这两个有什么不同?这是
idiomatic scala
吗?这样做的方式?我是 Scala 的新手,所以正确学习对我来说很重要。
最佳答案
在问题的第一部分,for comprehension 实现将范围 0 到 l.length-1
和 i1+1 到 l.length-1
定义为 IndexedSeq[Int]
因此产生的类型是特征 IndexedSeq[(Int, Int)]
由最终类 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 - scala:从列表生成元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32001729/