scala:从列表中生成元组

时间:2015-08-14 03:16:52

标签: list scala functional-programming

我有一个列表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. 这是idiomatic scala这样做的方式吗?我是Scala的新手,所以对我来说,我学得很对。

1 个答案:

答案 0 :(得分:6)

在问题的第一部分,for comprehension实现将范围TaskTaskTypeId = 5 AND Deleted IS NULL定义为0 to l.length-1,因此产生的类型是由final class i1+1 to l.length-1实现的特征IndexedSeq[Int] {1}}。

在第二部分,您的方法是有效的,但考虑以下我们不使用列表的索引引用,

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)) 表示忽略可能的其他元素)。由于迭代是在列表上,因此for comprehension会产生一个双重列表。