【问题标题】:sum of corresponding elements of array including nil数组对应元素的总和,包括 nil
【发布时间】:2014-11-27 16:53:38
【问题描述】:

我如何在 Ruby 中求和

[1, 2, nil, 4] 

与

[nil, 2, nil, 4] 

并且拥有

[1, 4, nil, 8]

?

【问题讨论】:

    标签: ruby arrays sum


    【解决方案1】:

    例如如下:

     a = [1, 2, nil, 4]
     b = [nil, 2, nil, 4]
     a.map.with_index {|v,i| (v || b[i]) && v.to_i + b[i].to_i }
    

    更美的方式是:

     a.zip(b).map {|v| v.compact.reduce(:+) }
    

    说明:这里#zip 只是用其他传递的值逐个值重构数组,因此第一行将由每个数组的第一个元素、第二个元素中的第二个等组成。然后@ 987654324@,#reduce 应用于第一行、第二行等。#compact 只是删除了nil 值,因此它们不包含在结果中。 #reduce 然后通过 :+ 在 sum(默认为 nil)和 value 之间的运算符为每一行构造一个总和,因此在输出中它导致值的总和 nil 以防空行.

    如果我们能得到更通用的方法,让我们对矩阵的行求和。

     m = [ [  1, 2, nil, 4],
           [nil, 2, nil, 4] ]
    
     m.shift.zip(*m).map {|v| v.compact.reduce(:+) }
    

    【讨论】:

    • 紧凑 - 减少,很棒。 +1
    • @CarySwoveland 和 -1 + 1? =)
    • @CarySwoveland 但是我的名字,你还好吗? =)
    • @CarySwoveland,最接近的拉丁语发音是我的名字是:Malo Skrylevo
    • @JavierGiovannini 一些已固定发布 =)
    【解决方案2】:
    a.zip(b).map {|x, y| x.nil? ? (y.nil? ? nil : y) : (y.nil? ? x : x + y)}
    # => [1, 4, nil, 8] 
    

    【讨论】:

      【解决方案3】:

      这是一种利用nil.to_i => O:

      a.zip(b).map { |e,f| [e,f]==[nil,nil] ? nil : e.to_i + f.to_i }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-22
        • 2022-10-13
        • 1970-01-01
        • 2015-03-03
        • 2015-09-20
        • 2018-07-04
        • 2010-09-25
        • 1970-01-01
        相关资源
        最近更新 更多