arrays - 如何在 ruby​​ 数组中仅添加正数?

标签 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, -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 ? 进行条件 .inject 的示例。真:假 ternary operator当条件为 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

或者:

> arr.partition{|e| e>0}.map{|sa| sa.sum}
=> [18, -10]

Ruby 是一种非常灵活的语言...

关于arrays - 如何在 ruby​​ 数组中仅添加正数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65778282/

相关文章:

java - 数组不返回字符串

javascript - Rails 5 不渲染 JQuery 结果

c++ - 快速整除测试(2、3、4、5、..、16)?

c++ - 从四元数查看矩阵

latex - 有没有带有 LaTeX 语法的计算器?

JavaScript : How to get Coordinates from JSON array within dictionary

arrays - 将对象数组转换为数组数组

arrays - 使用字典的 Vlookup 替代方案

mysql - SQL : ids containing specific arrays in a specific way

ruby - 如何在 Ruby 套接字中发送 NULL?