Arrays 如何在ruby数组中只添加正数?
我是ruby的新手,我正在尝试制作一个方法,可以得到所有正数的和,任何一个数字数组。以下是一个例子:Arrays 如何在ruby数组中只添加正数?,arrays,ruby,math,conditional-statements,Arrays,Ruby,Math,Conditional Statements,我是ruby的新手,我正在尝试制作一个方法,可以得到所有正数的和,任何一个数字数组。以下是一个例子: arr=(1,3,-1,7,4,-9,0,3) 这是我到目前为止尝试过的,但它只得到包含负值的和 def positive_sum(arr) arr.inject(0){|sum,x| sum + x } end 我的答案是:1+3+7+4+3=18,所以它忽略了所有的负数。提前感谢。您可以: > arr=[1,3,-1,7,4,-9,0,3] => [1, 3, -
arr=(1,3,-1,7,4,-9,0,3)
这是我到目前为止尝试过的,但它只得到包含负值的和
def positive_sum(arr)
arr.inject(0){|sum,x| sum + x }
end
我的答案是:1+3+7+4+3=18,所以它忽略了所有的负数。提前感谢。您可以:
> arr=[1,3,-1,7,4,-9,0,3]
=> [1, 3, -1, 7, 4, -9, 0, 3]
irb(main):005:0> arr.select{|e| e>=0}
=> [1, 3, 7, 4, 0, 3]
要获得正数,然后使用sum
方法:
> arr.select{|e| e>=0}.sum
=> 18
还有的快捷方式。选择(&:positive?)
:
然后你可以在上面使用.sum
如果要将条件与.inject
一起使用,则需要了解每个条件都需要返回一个值,该值在inject
执行的还原中使用。否则,您将混合失败条件中的nil
,而.inject
将不知道如何将其添加到总和中。解决方案是使用目前为止返回总和的三元数,而不是仅返回总和+n
下面是一个使用测试的条件.inject
示例?true:false
在条件为true和false时返回正确的值:
> arr.inject{|s,n| n>0 ? s+n : s }
=> 18
或者先过滤掉负数,然后使用inject作为求和方法:
> arr.select(&:positive?).inject(:+)
=> 18
同样的方法也适用于。reduce
:
> arr.reduce{ |s,n| n>0 ? s+=n : s }
=> 18
> arr.select(&:positive?).reduce(:+)
=> 18
您还可以使用.partition
将正片和负片分开,并同时处理这两种情况:
> arr.partition{|e| e>0}.each{|sa| p sa, sa.sum }
[1, 3, 7, 4, 3]
18
[-1, -9, 0]
-10
或:
Ruby是一种非常灵活的语言…
arr.sum(0){n |[n,0].max}
或arr.select{n | n>0}.sum(0)
@CarySwoveland:arr.select(&:positive?).sum
谢谢,这是有效的,我发现另一个有效的方法是arr.select{x | x>0}.reduce
> arr.partition{|e| e>0}.each{|sa| p sa, sa.sum }
[1, 3, 7, 4, 3]
18
[-1, -9, 0]
-10
> arr.partition{|e| e>0}.map{|sa| sa.sum}
=> [18, -10]