代码之家  ›  专栏  ›  技术社区  ›  brainfck

如何在Ruby中对数字数组求和?

  •  537
  • brainfck  · 技术社区  · 16 年前

    我有一个整数数组。

    array = [123,321,12389]
    

    有什么好办法可以算出它们的总和吗?

    我知道

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

    会有用的。

    21 回复  |  直到 12 年前
        1
  •  821
  •   David Wolever    10 年前

    或者尝试Ruby 1.9方式:

    array.inject(0, :+)
    

    注:该 0 nil 将在空数组上返回:

    > [].inject(:+)
    nil
    > [].inject(0, :+)
    0
    
        2
  •  637
  •   Fernando Briano    6 年前

    试试这个:

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

    See Ruby's Enumerable Documentation

    (注:附件) 0 需要基本情况,以便 0 将在空数组中返回,而不是 nil )

        3
  •  302
  •   David Wolever    10 年前
    array.reduce(0, :+)
    

    array.inject(0, :+) 减少 MapReduce programming models

    注射 , 减少 , 积累 压紧 都是一类 folding functions

    为了强调map-reduce-verbiage,这里有一个版本,它对数组中的结果更加宽容。

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

    其他相关阅读:

        4
  •  116
  •   Mike Woodhouse    16 年前

    或者(只是为了比较),如果您安装了Rails(实际上只是ActiveSupport):

    require 'activesupport'
    array.sum
    
        5
  •  87
  •   Alexander Oh    7 年前

    对于Ruby>=2.4.0您可以使用 sum

    [1, 2, 3, 4].sum
    

    mokeypatch基类是危险的。如果您喜欢danger并使用较旧版本的Ruby,可以添加 #sum Array 类别:

    class Array
      def sum
        inject(0) { |sum, x| sum + x }
      end
    end
    
        6
  •  51
  •   Community Mohan Dere    9 年前

    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)
    

    看见 this answer sum 是这样的。

        7
  •  22
  •   typo    9 年前

    Ruby 2.4+/Rails- array.sum [1, 2, 3].sum # => 6

    Ruby pre 2.4- array.inject(:+) array.reduce(:+)

    #sum 方法是对2.4的新添加 enumerable 因此,您现在可以使用 数组.sum 在纯ruby中,不仅仅是Rails。

        8
  •  19
  •   HashFail    12 年前

    为了多样性,如果数组不是数字数组,而是具有数字属性(例如数量)的对象数组,也可以这样做:

    array.inject(0){|sum,x| sum + x.amount}
    
        9
  •  18
  •   Vova    14 年前

    array.inject(0, &:+) 
    
        10
  •  5
  •   Santhosh    9 年前

    Ruby 2.4.0已经发布,它有一个 Enumerable#sum 方法所以你可以

    array.sum
    

    文档中的示例:

    { 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
    (1..10).sum                               #=> 55
    (1..10).sum {|v| v * 2 }                  #=> 110
    
        11
  •  4
  •   thedudecodes    8 年前

    前-

    a = [1,2,3,4,5,12,23.45,nil,23,nil]
    puts a.compact.inject(:+)
    
        12
  •  3
  •   the Tin Man    13 年前

    也允许 [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
    
        13
  •  2
  •   raj_acharya    8 年前

        [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:

    TypeError:无法将nil强制为整数

       [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: 评估

    计算字符串中的Ruby表达式。

      [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+
    
        14
  •  2
  •   Ulysse BN    4 年前

    如果你感到高兴,你可以做

    eval [123,321,12389]*?+
    

    仅用于打高尔夫球 ,则不应在正确的代码中使用它。

        15
  •  -1
  •   Giacomo1968 Arvind    11 年前

    你也可以用简单的方法来做

    def sum(numbers)
      return 0 if numbers.length < 1
      result = 0
      numbers.each { |num| result += num }
      result
    end
    
        16
  •  -9
  •   shabdar    10 年前

    地图 比如:

    array.map { |e| e }.sum
    
    推荐文章