我是 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, -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
还有.select(&:positive?)的快捷方式
:
> arr.select(&:positive?)
=> [1, 3, 7, 4, 3]
然后你可以使用 .sum
。
如果您想将条件与 .inject
一起使用,您需要了解每个条件都需要返回一个值,该值用于 inject
完成的减少。否则,您将混合失败条件中的 nil
,并且 .inject
将不知道如何将其添加到总和中。解决方案是使用返回到目前为止总和的三元数,而不是仅返回 sum+n。
这是使用 test ? 进行条件
ternary operator当条件为 true 和 false 时返回正确的值:.inject
的示例。真:假
> 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
或者:
> arr.partition{|e| e>0}.map{|sa| sa.sum}
=> [18, -10]
Ruby 是一种非常灵活的语言...
关于arrays - 如何在 ruby 数组中仅添加正数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65778282/