2015-08-14 41 views
3

我有一个列表val l=List(4,3,2,1),我试图生成(4,3), (4,2)等格式的元组列表。scala:从列表中生成元组

这是我到目前为止有:

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这样做的方式吗?我对斯卡拉来说很新,所以对我来说重要的是我学到了正确的东西。

回答

6

关于问题的第一部分,用于理解实现定义范围0 to l.length-1i1+1 to l.length-1和作为IndexedSeq[Int]因此得到的类型是由Vector最终类实现性状IndexedSeq[(Int, Int)]

在第二部分,你的做法是有效的,但考虑下面,我们不使用索引引用的名单,

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,_*)我们模式匹配并提取每个嵌套列表的前两个元素(_*表示忽略可能的附加元素)。由于迭代在列表上,理解产生一个双列表。

+0

谢谢,是否有任何理由使用List(a,b,_ *)而不仅仅是List(a,b)? – rivu