określona do tego bloku kodu:podziału kolekcji na „k” blisko do równe części (Scala, ale język agnostyka)
dataset
może byćVector
lubList
numberOfSlices
jestInt
oznaczające, ile "razy" należy wyciąć zbiór danych
Chcę podzielić zbiór danych na plasterki numberOfSlices
, rozprowadzane tak równomiernie, jak to możliwe. Przez "split" myślę, że mam na myśli "partycję" (przecięcie wszystkich powinno być puste, uncja wszystkich powinna być oryginalna) do użycia terminu teorii zbiorów, choć niekoniecznie jest to zbiór, tylko arbitralny zbiór.
np.
dataset = List(1, 2, 3, 4, 5, 6, 7)
numberOfSlices = 3
slices == ListBuffer(Vector(1, 2), Vector(3, 4), Vector(5, 6, 7))
Czy jest lepszy sposób to zrobić niż to, co mam poniżej? (które nie jestem nawet pewien, jest optymalny ...) A może to nie jest algorytmicznie wykonalne przedsięwzięcie, w którym to przypadku wszelkie znane dobre heurystyki?
val slices = new ListBuffer[Vector[Int]]
val stepSize = dataset.length/numberOfSlices
var currentStep = 0
var looper = 0
while (looper != numberOfSlices) {
if (looper != numberOfSlices - 1) {
slices += dataset.slice(currentStep, currentStep + stepSize)
currentStep += stepSize
} else {
slices += dataset.slice(currentStep, dataset.length)
}
looper += 1
}
Nie jestem pewien, jak interpretować "rozprowadzany tak równomiernie, jak to możliwe". Przechodząc przez twój kod, 'Seq: grouped (Int)' robi już to, co chcesz, poza tym, że nigdy nie przekracza rozmiaru wycinka. – Kaito
Wygląda na to, że "zgrupowane" podzieli go na grupy "x", natomiast chcę podzielić kolekcję na grupy "x". Próbowałem go w odpowiedzi, 'List (1, 2, 3, 4, 5) .grouped (2) .toList' daje' List (Lista (1, 2), Lista (3, 4), Lista (5)) 'podczas gdy ja chcę czegoś takiego jak' Lista (lista (1, 2), lista (3, 4, 5)) '. – adelbertc