Arrays 如何在scala中减少集合中的积极元素?

Arrays 如何在scala中减少集合中的积极元素?,arrays,scala,collections,Arrays,Scala,Collections,给定整数数组nums: -2,1,-3,4,6,-1,2,1,1,-5,4 我想将此数组转换为另一个数组: -2,1,-3,10,-1,4,-5,4 我可以给reduce函数添加一个条件吗 诸如此类: ... val nums = Array(-2,1,-3,4,6,-1,2,1,1,-5,4) val reduced = nums.reduce((x, y) => { if (x > 0 && y > 0){ x + y } }

给定整数数组nums:

-2,1,-3,4,6,-1,2,1,1,-5,4

我想将此数组转换为另一个数组:

-2,1,-3,10,-1,4,-5,4

我可以给reduce函数添加一个条件吗

诸如此类:

...
val nums = Array(-2,1,-3,4,6,-1,2,1,1,-5,4)
val reduced = nums.reduce((x, y) => {
    if (x > 0 && y > 0){
        x + y
    }
})

...
您可以尝试下一步:

val result=Array(-2,1,-3,4,6,-1,2,1,1,-5,4).foldLeft(ListBuffer.empty[Int]){
如果项目<0=>result:+item,则案例(结果,项目)
如果item>0=>result.lastOption.filter(>0).fold(result:+item){positiveSum=>
result.update(result.size-1,阳性+项目)
结果
}
}
println(结果)
这将产生所需的结果:
(-2,1,-3,10,-1,4,-5,4)

希望这有帮助

我不确定您是否可以使用reduce或其他简单的内置函数来实现您的目标

但是,您可以编写一个简单的尾部递归函数来实现您想要的功能(它使用列表和模式匹配):

当然,这可以通过使用列表作为输入而不是数组来简化,但在您的问题中,您特别提到了数组

scala> val nums = Array(-2,1,-3,4,6,-1,2,1,1,-5,4)
nums: Array[Int] = Array(-2, 1, -3, 4, 6, -1, 2, 1, 1, -5, 4)

scala> nums.foldLeft(List[Int]()){ 
         case (init :+ last, num) if last > 0 && num > 0 => init :+ (last + num)
         case (res, num) => res :+ num 
       }
res0: List[Int] = List(-2, 1, -3, 10, -1, 4, -5, 4)
或:


一个简单的、非尾部递归的:

def reducePositives(l: List[Int]): List[Int] = {
  l.span(_ > 0) match {
    case (Nil, Nil) => Nil
    case (Nil, np :: rest) => np :: reducePositives(rest)
    case (p, rest) => p.sum :: reducePositives(rest)
  }
}
scala> def reduce(nums: Seq[Int]): Seq[Int] = nums match {
     |   case x1+:x2+:xs => if(x1>0 && x2>0) reduce((x1+x2)+:xs) else x1+:reduce(x2+:xs)
     |   case ns => ns
     | }
def reduce(nums: Seq[Int]): Seq[Int]

scala> reduce(nums)
val res1: Seq[Int] = ArraySeq(-2, 1, -3, 10, -1, 4, -5, 4)
def reducePositives(l: List[Int]): List[Int] = {
  l.span(_ > 0) match {
    case (Nil, Nil) => Nil
    case (Nil, np :: rest) => np :: reducePositives(rest)
    case (p, rest) => p.sum :: reducePositives(rest)
  }
}