Инициализировать массив целых чисел в цикле - PullRequest
0 голосов
/ 04 марта 2019

Я хочу инициализировать массив последовательных целых чисел (скажем, от 1 до 100) в Scala.

val N = 100
val arr = new Array[Int](N)

Как лучше всего это сделать в императивной и функциональной парадигмах?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Функциональный, лаконичный и общий

Наиболее общий функциональный способ инициализации массивов, вероятно, будет tabulate:

Array.tabulate(100)(_ + 1)

Здесь первый аргумент - это размер массива,и второй аргумент - это функция, которая отображает индексы на значения.


Обязательное условие: громоздкое, но очень быстрое

Если вы хотите сделать это как можно быстрее, используя один поток,тогда следующий императивный код, вероятно, будет трудно превзойти, потому что он нигде не использует функции более высокого порядка:

val N = 100
val a = new Array[Int](N)
var i = 0
while (i < N) {
  a(i) = i + 1
  i += 1
}

Он также имеет то преимущество, что у вас есть контроль над массивом, так что вы не 'Вы должны выделить любую новую память, если у вас уже есть выделенный массив.


С параллельными коллекциями

Если инициализация будет менее тривиальной (не просто увеличить целое число), следующеераспараллеленная версия может работать быстрее для очень больших N:

val arr = new Array[Int](N)
for (i <- (0 until N).par) {
  arr(i) = i + 1
}

Быстро и грязно (и, вероятно, так же быстро, как и императив vв любом случае)

Как уже упоминалось в комментарии, в этом простом случае

(1 to 100).toArray

было бы достаточно.

0 голосов
/ 04 марта 2019

Существует выделенный Array строитель (Array.range) для построения Array в качестве диапазона:

диапазон определения (начало: Int, конец: Int): Array [Int]

Array.range(0, 10)
// Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
0 голосов
/ 04 марта 2019

Если вы из мира императивного программирования, вы найдете эту технику знакомой:

for (i <- 0 to N-1) {
  arr(i) = i + 1
}

Обратите внимание, что массивы в Scala доступны с использованием изогнутыхи не квадратные (как в Java, C и т. д.).

Более функционал способ инициализации массива будет:

val arr = (1 to N).toArray
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...