2013-11-16 1 views
2

Ниже генерирует вектор неизменных векторов:Scala использует заливку или пластинчатый с изменяемыми записями

var darr = Vector.tabulate(2, 3){ (a,b) => a*2+b } 
darr: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = Vector(Vector(0, 1, 2), Vector(2, 3, 4)) 

Но что нужно для нашего случая использования является вектором изменяемых векторов. Как это можно сделать?

ответ

6

Просто делать вложенные вызовы tabulate, где внутренний вызов находится на изменяемом последовательности, как Buffer:

import collection.mutable.Buffer 
Vector.tabulate(2)(a => Buffer.tabulate(3)(b => a*2+b)) 
// Vector(ArrayBuffer(0, 1, 2), ArrayBuffer(2, 3, 4)) 

2D-tabulate действительно просто синтаксический сахар для вложенного tabulate все равно:

// From GenTraversableFactory 
def tabulate[A](n1: Int, n2: Int)(f: (Int, Int) => A): CC[CC[A]] = 
    tabulate(n1)(i1 => tabulate(n2)(f(i1, _))) 
+0

Спасибо, это то, что я хочу. Pls считают upvote. – javadba

+0

Точный функциональный рецепт, используя каррирование. – shvahabi

1

Если ваша коллекция остается того же размера, и все, что вам нужно, это изменяемые записи, то я думаю, что использование 2D-массива может быть хорошим решением. В качестве дополнительного бонуса объект Array в Scala предоставляет методы tabulate для создания массивов с 1D по 5D. Все, что мне нужно сделать, чтобы получить эту работу было изменить слово Vector в исходном примере для Array и она работает просто отлично:

scala> var darr = Array.tabulate(2, 3){ (a,b) => a*2+b } 
darr: Array[Array[Int]] = Array(Array(0, 1, 2), Array(2, 3, 4)) 

 Смежные вопросы

  • Нет связанных вопросов^_^