假设我们有:
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
,foldLeft
和reduceLeft
但找不到合适的功能解决方案。我来自Java世界,并且在功能性思维方面存在问题。
任何帮助将不胜感激!
THX!
答案 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