Scala以前元素的部分列表

时间:2015-03-25 05:58:12

标签: list scala

假设我们有:

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))

老实说,我尝试使用scanleftfoldLeftreduceLeft但找不到合适的功能解决方案。我来自Java世界,并且在功能性思维方面存在问题。

任何帮助将不胜感激!

THX!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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 :(得分:2)

这可能是一个可能更为明显的解决方案:

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