Scala: фильтрация массива с фильтрами для каждого - PullRequest
5 голосов
/ 21 ноября 2019

У меня есть такая проблема: я хочу перебрать элементы массива, которые удовлетворяют определенному условию.

Первое, что я хочу сделать, - это использовать метод filter в оригиналемассив, а затем перебирает полученные элементы. Но у меня были некоторые проблемы с использованием памяти, то есть пространство кучи Java. Когда фильтр применяется к массиву, он будет создавать новый массив? Таким образом, он будет копировать каждый элемент?

Лучше ли использовать этот подход:

array.filter(<condition>).foreach{ element =>
   do something
}

Или следующий?

for(i <- array.indices if <condition>){
   do something
}

Более того, я написал эти дватесты:

с для

val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
  elements.update(i, math.random)
}
var cont = 0
val n = 0.5
while(true){
  cont = 0
  for (j <- elements.indices if elements(j) < n) {
    cont += 1
  }
  println(cont)
}

с фильтром

val size = 10000000
val elements = Array.ofDim[Double](size)
for (i <- elements.indices) {
  elements.update(i, math.random)
}

val n = 0.5
while(true){
  val valid = elements.filter(x => x < n)
  println(valid.size)
}

и я проверил использование памяти с помощью VisualVM, похоже, что первое решение использует меньше памяти, чем второе.

Это память, используемая первым решением enter image description here

Это используемая памятьпо второму решению enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...