我有一个列表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的新手,所以对我来说,我学得很对。
答案 0 :(得分:6)
在问题的第一部分,for comprehension实现将范围Task
和TaskTypeId = 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会产生一个双重列表。