如何在功能样式中粗糙(而不是展平)列表?

use*_*304 6 functional-programming scala clojure

例如,我有一个列表(1 2 3 4 5 6 7 8 9 10 11),并希望通过3个元素(或另一个长度)粗糙来获得((1 2 3) (4 5 6) (7 8 9) (10 11)).我可以使用什么漂亮的代码呢?谢谢.

Tho*_*ung 15

List(1,2,3,4,5,6,7,8,9,10,11) grouped 3 toList

res0: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), 
List(7, 8, 9), List(10, 11))
Run Code Online (Sandbox Code Playgroud)


Mic*_*zyk 15

既然你也使用Clojure标签......

在Clojure 1.2中有一个内置函数可以在clojure.contrib.seq-utils中的1.1中使用.

(partition-all 3 [1 2 3 4 5 6 7 8 9 10 11])
; => ((1 2 3) (4 5 6) (7 8 9) (10 11))
Run Code Online (Sandbox Code Playgroud)

另见partitionpartition-by.另外请注意,partitionpartition-all,如果你需要的东西略有不同的接受一些可选参数,例如见(doc partition)在REPL.

  • 我经常对Clojure图书馆的广泛功能感到惊讶......但希望有一种聪明的方法可以快速找到你想要的那些!(当然要求stackoverflow上的超级巨星总是一个选项:-)) (3认同)
  • 请参阅http://clojure.org/cheatsheet - 分区就在"嵌套seqs"中. (3认同)

Dar*_*rio 2

def split[A](list : List[A], n : Int) : List[List[A]] = list match {
    case List() => List()
    case     _  => (list take n) :: split(list drop n, n)
}
Run Code Online (Sandbox Code Playgroud)