有没有一种方法可以从Scala中的给定数组创建n个元素的subArray块?

时间:2019-01-05 02:44:59

标签: arrays scala multidimensional-array

给出Scala arrayBuffer: ArrayBuffer(200, 13, 1, 200, 15, 1, 201, 13, 0, 202, 14, 3, 199, 10, 2, 199, 11, 3, 199, 96, 2)

预期输出: ArrayBuffer((200, 13, 1), (200, 15, 1), (201, 13, 0), (202, 14, 3), (199, 10, 2), (199, 11, 3), (199, 96, 2))

有没有一种简单的方法可以在Scala中实现这种形式的分块而无需for循环?所需的chunk_size为3。这些元素的顺序必须相同。

我尝试过:

def chunkArray(myArray){
    val chunk_size = 3
    var index = 0
    var arrayLength = arrayToInsert.length
    var tempArray =  ArrayBuffer[Int](2)
    val numChunks = arrayToInsert.length / 3
    for (i <- 0 to numChunks-1) {
        var myChunk = arrayToInsert.slice(i*chunk_size, (i+1)*chunk_size)   
        tempArray += (myChunk(0), myChunk(1), myChunk(2))
    }
}

预期结果: ((200, 13, 1), (200, 15, 1), (201, 13, 0), (202, 14, 3), (199, 10, 2), (199, 11, 3), (199, 96, 2))

3 个答案:

答案 0 :(得分:4)

您要使用.grouped(3)

(集合API examples

collection.mutable.ArrayBuffer(200, 13, 1, 200, 15, 1, 201, 13, 0, 202, 14, 3, 199, 10, 2, 199, 11, 3, 199, 96, 2).grouped(3).toArray 

res2: Array[collection.mutable.ArrayBuffer[Int]] = Array(ArrayBuffer(200, 13, 1), ArrayBuffer(200, 15, 1), ArrayBuffer(201, 13, 0), ArrayBuffer(202, 14, 3), ArrayBuffer(199, 10, 2), ArrayBuffer(199, 11, 3), ArrayBuffer(199, 96, 2))

答案 1 :(得分:1)

这将创建一个Buffer元组,这就是原始代码似乎尝试的。

import collection.mutable.ArrayBuffer
val data = 
  ArrayBuffer(200, 13, 1, 200, 15, 1, 201, 13, 0 /*etc.*/)

data.grouped(3).collect{case Seq(a,b,c) => (a,b,c)}.toBuffer
//res0: Buffer[(Int, Int, Int)] = ArrayBuffer((200,13,1), (200,15,1), (201,13,0) /*etc.*/)

请注意,如果最后的group不是3个元素,那么它将被忽略。

答案 2 :(得分:1)

这也可以通过滑动来实现:

myArray.sliding(3, 3).toArray

无论如何,如此处Scala: sliding(N,N) vs grouped(N)

所述,.grouped更适合此用例。