Есть ли способ создать куски subArray из n элементов из данного массива в Scala? - PullRequest
0 голосов
/ 05 января 2019

Учитывая массив ScalaBuffer: 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 голосов
/ 05 января 2019

Это создаст 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 элемента, он будет проигнорирован.

0 голосов
/ 05 января 2019

Это также может быть достигнуто с помощью скольжения:

myArray.sliding(3, 3).toArray

В любом случае, .grouped лучше подходит для этого варианта использования, как описано здесь Scala: скольжение (N, N) против сгруппированного (N)

0 голосов
/ 05 января 2019

Вы хотите использовать .grouped(3)

(API коллекции примеры )

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...