根据其值和另一个数组的值更新一个数组

时间:2018-08-27 13:14:29

标签: arrays scala dictionary boolean

我正在尝试根据其他数组的值更改数组的值。特别是这些是我正在使用的数组:

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

我想检查数组idx1的正确性,我想在该特定位置将inpoly设置为true,否则,只需保留inpoly的值有。

我的预期结果是拥有这个数组:

final_vector= true, true, true, false

由于idx1的第一个值为true,因此将true分配给inpolyidx1的所有其他值均为false,因此请按原样保留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 :(得分:1)

您似乎想在布尔对上使用“或”。这是使用||(Scala的OR函数)的一种方法:

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

这将为您提供:

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

在这里,zip会将两个数组组合成一个成对的数组。然后,您将映射这些对,如果其中一个为true,则返回true;如果两个均为false,则返回false。

您还可以使用模式匹配:

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中,建议使用不可变值,尽管这可能需要一些时间来习惯。

答案 1 :(得分:0)

您需要压缩两个数组,以便可以在一对值fe上进行迭代:

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

但是请注意,这段代码将创建新的数组,inpoly将不会更改。