Обновите массив на основе его значений и значений другого массива - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь изменить значение массива на основе значения другого массива. В частности это массивы, с которыми я работаю:

val inpoly: Array[Boolean]=Array(false, true, true, false)
val idx1: Array[Boolean]=Array(true, false, false, false)

Я хотел бы проверить массив idx1 и где он равен true, я бы хотел установить inpoly в значение true в этой конкретной позиции, в противном случае просто оставьте значение, которое inpoly уже имеет.

Мой ожидаемый результат будет иметь этот массив:

final_vector= true, true, true, false

, поскольку первое значение idx1 равно true, присвойте true inpoly. Все остальные значения idx1 являются ложными, поэтому оставьте inpoly как есть

Я попробовал следующий код:

idx1.map({
  case true => true
  case false => inpoly})

Однако я получаю следующий результат:

res308: Array[Any] = Array(true, Array(false, true, true, false), Array(false, true, true, false), Array(false, true, true, false))

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Похоже, вы хотите использовать «ИЛИ» для пар логических значений. Вот один из подходов, использующий ||, который является функцией OR в Scala:

val updated = inpoly.zip(idx1).map(pair => pair._1 || pair._2)

что даст вам:

updated: Array[Boolean] = Array(true, true, true, false)

Здесь zip объединит два массива в один массив пар. Затем вы отобразите эти пары и вернете истину, если любая из них истинна, и ложь, если обе ложны

Вы также можете использовать сопоставление с шаблоном:

val updated = inpoly.zip(idx1).map {
 case (left, right) => left || right
 case _ => None 
}

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

И, если вы настаиваете на изменении inpoly вместо создания нового массива, сделайте следующее:

var inpoly: Array[Boolean]=Array(false, true, true, false)
val idx1: Array[Boolean]=Array(true, false, false, false)

inpoly = inpoly.zip(idx1).map(pair => pair._1 || pair._2)

Обратите внимание, что здесь мы объявляем inpoly как var, а не val. Однако вместо этого я бы предложил сохранить inpoly как val и создать новый val для обновленной версии этого массива. Использование неизменяемых значений является рекомендуемой практикой в ​​Scala, хотя для этого может потребоваться некоторое привыкание.

0 голосов
/ 27 августа 2018

Вам нужно сжать оба массива, чтобы вы могли перебрать пару значений, например: .1001*

idx1.zip(inpoly).map{
  case (true, _) => true
  case (_, value) => value
}

Но учтите, что этот код создаст новый массив, inpoly не изменится.

...