如何总结在Ruby中的数字阵列?如何总结在Ruby中的数字阵列?(How to sum array

2019-05-06 11:53发布

我有一个整数数组。

例如:

array = [123,321,12389]

有没有什么好的办法让他们的总和?

我知道

sum = 0
array.each { |a| sum+=a }

会工作。

Answer 1:

试试这个:

array.inject(0){|sum,x| sum + x }

见Ruby的可枚举文档

(注意: 0是需要基础案例,使得0将一个空数组,而不是在被返回nil



Answer 2:

或尝试Ruby 1.9的方式:

array.inject(0, :+)

注: 0需要碱情况下另有nil将在空数组返回:

> [].inject(:+)
nil
> [].inject(0, :+)
0


Answer 3:

array.reduce(0, :+)

虽然相当于array.inject(0, :+)术语减少正在进入与崛起的更常见的白话MapReduce编程模型 。

注入减少折叠积累 ,和压缩都是同义作为一类的折叠功能 。 我觉得整个的一致性代码库最重要的,但由于各种社区往往比另一个更喜欢一个词,它仍然有必要了解的替代品。

要强调的map-reduce空话,这里有一个版本是什么数组中结束了多一点点宽容。

array.map(&:to_i).reduce(0, :+)

一些更多的相关阅读:

  • http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject
  • http://en.wikipedia.org/wiki/MapReduce
  • http://en.wikipedia.org/wiki/Fold_(higher-order_function)


Answer 4:

或者(只作比较),如果你有安装了Rails(实际上只是的ActiveSupport):

require 'activesupport'
array.sum


Answer 5:

这是危险的mokeypatch基类和现在的Ruby 2.4.0对可枚举和不需要的和危险的。 如果你喜欢危险,使用Ruby的是旧版本,你可以添加#sumArray类:

class Array
  def sum
    inject(0) { |sum, x| sum + x }
  end
end

然后做有趣的东西,如:

[1, 2, 3, 4].sum


Answer 6:

新的Ruby 2.4.0

您可以使用适当命名的方法Enumerable#sum 。 它拥有超过很多优点inject(:+)但也有在年底读取以及一些重要的注意事项。

例子

范围

(1..100).sum
#=> 5050

数组

[1, 2, 4, 9, 2, 3].sum
#=> 21

[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7

重要的提示

这种方法是不等同于#inject(:+) 例如

%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer

也,

(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)

见这个答案对于为什么更多信息sum是这样的。



Answer 7:

只是为了多元化的目的,你也可以做到这一点,如果你的阵列是不是数字的排列,而是必须是数字(例如量)属性的对象数组:

array.inject(0){|sum,x| sum + x.amount}


Answer 8:

红宝石1.8.7方法如下:

array.inject(0, &:+) 


Answer 9:

红宝石2.4 + /导轨- array.sum[1, 2, 3].sum # => 6

红宝石预2.4 - array.inject(:+)array.reduce(:+)

*注: #sum方法是一个新的除了2.4 enumerable ,所以你现在可以使用array.sum纯红宝石,而不仅仅是轨。



Answer 10:

你可以简单地使用:

    example = [1,2,3]
    example.inject(:+)


Answer 11:

这是足够的[1,2,3].inject('+')



Answer 12:

红宝石2.4.0发布,它有一个可枚举#和方法。 所以,你可以做

array.sum

从文档的例子:

{ 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
(1..10).sum                               #=> 55
(1..10).sum {|v| v * 2 }                  #=> 110


Answer 13:

还允许[1,2].sum{|x| x * 2 } == 6 [1,2].sum{|x| x * 2 } == 6

# http://madeofcode.com/posts/74-ruby-core-extension-array-sum
class Array
  def sum(method = nil, &block)
    if block_given?
      raise ArgumentError, "You cannot pass a block and a method!" if method
      inject(0) { |sum, i| sum + yield(i) }
    elsif method
      inject(0) { |sum, i| sum + i.send(method) }
    else
      inject(0) { |sum, i| sum + i }
    end
  end
end


Answer 14:

与零值的数组,我们可以做的小巧,然后注入和EX-

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)


Answer 15:

array.reduce(:+)

工程范围太...因此,

(1..10).reduce(:+) returns 55


Answer 16:

方法1:

    [1] pry(main)> [1,2,3,4].sum
    => 10
    [2] pry(main)> [].sum
    => 0
    [3] pry(main)> [1,2,3,5,nil].sum
    TypeError: nil can't be coerced into Integer

方法2:

   [24] pry(main)> [].inject(:+)
   => nil
   [25] pry(main)> [].inject(0, :+)
   => 0
   [4] pry(main)> [1,2,3,4,5].inject(0, :+)
   => 15
   [5] pry(main)> [1,2,3,4,nil].inject(0, :+)
   TypeError: nil can't be coerced into Integer
   from (pry):5:in `+'

方法3:

   [6] pry(main)> [1,2,3].reduce(:+)
   => 6
   [9] pry(main)> [].reduce(:+)
   => nil
   [7] pry(main)> [1,2,nil].reduce(:+)
   TypeError: nil can't be coerced into Integer
   from (pry):7:in `+'

方法4:在阵列包含一个零和空值,默认情况下,如果你使用任何上述功能降低,总之,通过注入一切都会

类型错误:无不能强迫整数

你可以克服这个问题,

   [16] pry(main)> sum = 0 
   => 0
   [17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
   => [1, 2, 3, 4, nil, ""]
   [18] pry(main)> sum
   => 10

方法6:EVAL

评估在串红宝石表达式(一个或多个)。

  [26] pry(main)> a = [1,3,4,5]
  => [1, 3, 4, 5]
  [27] pry(main)> eval a.join '+'
  => 13
  [30] pry(main)> a = [1,3,4,5, nil]
  => [1, 3, 4, 5, nil]
  [31] pry(main)> eval a.join '+'
  SyntaxError: (eval):1: syntax error, unexpected end-of-input
  1+3+4+5+


Answer 17:

如果你觉得golfy,你可以做

eval([123,321,12389]*?+)

这将创建一个字符串“123 + 321 + 12389”,然后使用函数eval做的总和。 这是只对高尔夫的目的 ,你不应该在适当的代码中使用它。



Answer 18:

或者你也可以试试这个方法:

def sum arr
  0 if arr.empty
  arr.inject :+
end


Answer 19:

这是最近的路。 试试吧。

array.inject :+



Answer 20:

你也可以做到这一点的简单方法

def sum(numbers)
  return 0 if numbers.length < 1
  result = 0
  numbers.each { |num| result += num }
  result
end


Answer 21:

您可以使用.MAP.SUM这样的:

array.map { |e| e }.sum


文章来源: How to sum array of numbers in Ruby?