2016-09-02 5 views
2

Я хочу, чтобы группировать элементы списка, такие как:Группировка списка

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

О преобразовании он должен вернуть новый список, как:

val newlst = List(List(1), List(1,2), List(1,2,3), List(1,2,3,4), Lis(1,2,3,4,5)) 
+2

Было бы неплохо увидеть, что вы пробовали в первую очередь: '(от 1 до lst.length) .map (i => lst.take (i)). ToList'. –

ответ

3

(1 to lst.size map lst.take).toList должен это сделать.

4

Вы можете сделать это следующим образом:

lst.inits.toList.reverse.tail 
+0

Вау! Да здравствует коллекция Scala! – Samar

+0

Это более идиоматично, чем мой ответ :) Я полностью что-то обнаружил, спасибо – C4stor

0

Двигаемся foldLeft кажется более эффективным, хотя и некрасиво:

(lst.foldLeft((List[List[Int]](), List[Int]()))((x,y) => { 
    val z = x._2 :+ y; 
    (x._1 :+ z, z) 
}))._1 
0

Не так хороша, или коротким, как другие, но нужно иметь какой-то хвост рекурсии для души:

def createFromElements(list: List[Int]): List[List[Int]] = { 
    @tailrec 
    def createFromElements(l: List[Int], p: List[List[Int]]): List[List[Int]] = 
    l match { 
    case x :: xs => 
     createFromElements(xs, (p.headOption.getOrElse(List()) ++ List(x)) :: p) 
    case Nil => p.reverse 
    } 

    createFromElements(list, Nil) 
} 

А теперь:

scala> createFromElements(List(1,2,3,4,5)) 
res10: List[List[Int]] = List(List(1), List(1, 2), List(1, 2, 3), List(1, 2, 3, 4), List(1, 2, 3, 4, 5)) 
Смежные вопросы