2015-10-27 70 views
1

的有限序列斯卡拉分組集合通過值

val xs = (1 to 9).toArray 

我們可以爲實例組中每兩個連續的項目就是這樣,

xs.grouped(2) 

然而,給定的值的有限序列,即例如

val gr = Seq(3,2,1) 

如何分組xs總部設在gr使

xs.grouped(gr) 
res: Array(Array(1,2,3), Array(4,5), Array(6), Array(7,8,9)) 

回答

1

下面的函數生成你正在尋找的結果,但我懷疑有可能是一個更好的辦法:

def grouped[T](what: Seq[T], by: Seq[Int]) = { 

    def go(left: Seq[T], nextBy: Int, acc: List[Seq[T]]): List[Seq[T]] = (left.length, by(nextBy % by.length)) match { 
    case (n, sz) if n <= sz => left :: acc 
    case (n, sz) => go(left.drop(sz), nextBy+1, left.take(sz) :: acc) 
    } 

    go(what, 0, Nil).reverse 
} 
2

請考慮以下解決方案:

def groupBySeq[T](arr:Array[T], gr:Seq[Int]) = { 
    val r = gr.foldLeft((arr, List[Array[T]]())) { 
    case ((rest, acc), item) => (rest.drop(item), rest.take(item)::acc) 
    } 
    (r._1::r._2).reverse 
}