Arrays 删除scala中整数数组缓冲区中的所有负元素
我有一个关于编码的问题。我在数据库中遇到过类似类型的问题,但没有一个能消除我的疑虑。我正在读《不耐烦的斯卡拉》一书。下面的代码从数组中删除负元素,并将正元素作为输出Arrays 删除scala中整数数组缓冲区中的所有负元素,arrays,scala,Arrays,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(
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)
val a=ArrayBuffer(-1,1,0,-2,-1,2,5,6,7)
val PositionStokep=对于(i=0)屈服点i
对于(jAs a是一个缓冲数组,因此我们可以更改数组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时,我们需要li东北4
第4行:考虑方案
val a=Array(1,2,3,4,5,6)
然后我们的positionToKeep将拥有所有元素,并且两个数组的长度将相等
val positionToKeep = Array(1, 2, 3, 4, 5, 6)
在这种情况下,因为a的长度和位置ToKeep相等,所以线四个trimEnd(0)
vala=Array(1,2,3,4,-5,-6,8,9,-3)
在这种情况下,我们将有数组(1,2,3,4,8,9)
在第3行中,我们将更新数组a,在第4行之前更新之后,这就是数组a的外观。
数组(1,2,3,4,8,9,8,9,-3)
因为我们只需要长度为6的值,因为我们只有6个正值。我们需要删除tripEnd为我们做的最后3个元素。第3行和第4行再次填充数组Buffer a,其中第1行将positionToKeep的值放入a,第4行修剪数组a,这是数组a中剩下的元素。a.filterNot(<0)
:)a.filter(0)。@AndreyTyukin是的,它们都创建了某种新的缓冲区,但至少filter
是功能性的。这似乎在适当的位置工作a.trimEnd(a.length-a.fold(0){case(i,v)=>a(i)=v;if(v<0)i else i+1})
但是更新你正在折叠的集合是不可靠的!@Tim并非所有的解决方案都必须创建一个新的缓冲区。原始示例的全部要点是过滤在a
内部进行。trimEnd
也可以在适当的位置工作,并修改a
。positionstokep
是一个麻烦-它可以是通过合并第2行和第3行很容易避免,因此根本不需要分配额外的空间。
val positionToKeep = Array(1, 2, 3, 4, 5, 6)