2015-03-25 62 views
0

的部分名單比方說,我們有:斯卡拉以前的元素

val abc = List(1,2,3,4,5) 

我們希望能夠產生5所列出每個加時賽那些包括以前的所有元素,包括當前一個像列表:

//res0: List[List[Int]] = List(List(1), List(1,2), List(1,2,3), List(1,2,3,4), List(1,2,3,4,5)) 

老實說,我嘗試了scanleft,foldLeftreduceLeft,但找不到合適的功能解決方案。我來自Java世界,並且具有功能性思維的問題。

任何幫助,將不勝感激!

Thx!

回答

4
val abc = List(1,2,3,4,5) 

val v = abc.scanLeft(List[Int]()){(a, acc)=> a++ List(acc)}.tail 
2

更多剝皮的貓:

scala> List(1,2,3,4,5).inits.toList.reverse.tail 
res0: List[List[Int]] = List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5)) 

scala> val is = List(1,2,3,4,5) 
is: List[Int] = List(1, 2, 3, 4, 5) 

scala> ((List.empty[List[Int]], List.empty[Int]) /: is) { 
    | case ((all, cur), i) => val next = cur :+ i ; ((all :+ next, next)) } 
res3: (List[List[Int]], List[Int]) = (List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5)),List(1, 2, 3, 4, 5)) 

scala> (List(List(is.head)) /: is.tail) { 
    | case (all, i) => all :+ (all.last :+ i) } 
res4: List[List[Int]] = List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5)) 
2

這裏有一個可能是笨拙的解決方案,可能會更明顯閱讀:

(1 to abc.length).map(abc.take).toList 
+0

順便說一句,這是很慢,然後'scanLeft '變種。 – DaunnC 2015-03-25 08:08:21

+1

@DaunnC爲什麼? ++操作在acc.length中是線性的,所以它將以任何方式爲二次方。 – 2015-03-25 08:17:48

+0

是的,你說得對,我的機器上有一些錯誤或者其他問題(需要更多的研究)在Scala 2.10.3中,對於沒有完整的評論感到抱歉。 – DaunnC 2015-03-25 09:52:18