从scala中的整数数组缓冲区中删除所有负元素

时间:2019-02-03 05:31:15

标签: arrays scala

我对编码有疑问。我遇到的数据库中有类似类型的问题,但这些问题都没有消除我的疑问。我要读《急躁的scala》一书。下面的代码从数组中删除了负元素,并给出了正元素作为输出

val a = ArrayBuffer(-1, 1, 0, -2, -1, 2, 5, 6, 7)
val positionsToKeep = for (i <- a.indices if a(i) >= 0) yield i
for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

给出的输出为(1,0,2,5,6,7)除去所有负元素。 我无法理解第3行和第4行。

for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
a.trimEnd(a.length - positionsToKeep.length)

自这两天以来的两天以来,我一直在挠挠头,但不能放弃,我终于将其张贴在这里寻求帮助。

1 个答案:

答案 0 :(得分:1)

由于a是bufferArray,因此我们可以更改数组a的值。

第3行:

第3行正在填充,或者您可以说将positionToKeep的值更新为a。

a(j) = positionToKeep(j)
// which is running like this 
// a(0) = positionToKeep(0)
// a(1) = positionToKeep(1) .... and so on 

现在,将positionToKeep的所有值填充到a中之后会发生什么,可能会有些旧值保持不变。第四行删除或删除这些元素。在我们将所有正值都放在数组中的情况下,第四行没有用,但是当a的长度大于positionToKeep时,则需要第四行。

第4行:考虑场景

  1. val a = Array(1, 2, 3, 4, 5, 6)

    然后我们的positionToKeep将拥有所有元素,并且两个数组的长度将相等。

    val positionToKeep = Array(1, 2, 3, 4, 5, 6)
    

    在这种情况下,第四个行trimEnd(0)因为a的长度和positionToKeep相等。

  2. val a = Array( 1, 2, 3, 4, -5, -6, 8, 9, -3)

    在这种情况下,我们将Array(1,2,3,4,8,9)放在positionToKeep

在第3行中,我们将更新数组a,然后在第4行之前进行更新,这就是数组a的外观。 Array(1,2,3,4,8,9,8,9,-3),因为我们只有6个正值,因此我们只需要长度不超过6的值。我们需要删除tripEnd对我们所做的最后3个元素。