Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 删除scala中整数数组缓冲区中的所有负元素_Arrays_Scala - Fatal编程技术网

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)