【问题标题】:Conditional summarizing via inject通过注入进行条件汇总
【发布时间】:2010-12-03 17:18:52
【问题描述】:

如何获取项目的索引:

my_array.inject {|rs,item| rs += item}

我需要总结除第 i 个元素之外的所有元素。

【问题讨论】:

    标签: ruby code-injection enumerable


    【解决方案1】:

    使用index数组方法:

    >> arr = ['a','b', 'c','a']
    => ["a", "b", "c", "a"]
    >> arr.index('a')
    => 0
    >> arr.index('b')
    => 1
    

    【讨论】:

      【解决方案2】:

      简单总结一下指标。

      (0...a.size).inject(0) { |sum, index| if index != (i - 1) then sum + my_array[i] else sum }
      

      【讨论】:

      • 谢谢,但看起来有更简单的方法:my_arr.inject {|rs,item| rs += item if my_arr.index(item)!= 0}
      • 但是您建议的更简单的方法对于重复项目很危险,而且性能要差得多 - 元素查找需要 O(n)。
      【解决方案3】:

      您必须自己编写(即使在 Ruby 1.9 中,因为注入不返回迭代器)。

      module Enumerable
        def inject_with_index(injected)
          each_with_index {|value, index| injected = yield(injected, value, index)}
          injected
        end
      end
      

      编辑:如果您切换 injecteach_with_index(感谢评论者!),您可以在没有新方法的情况下做到这一点:

      ["a", "b", "c"].each_with_index.inject("") do |result, (value, index)|
        index != 1 ? result + value : result
      end
      

      如果您想排除该值,请确保只返回 result。这也适用于第一种方法。

      【讨论】:

      • 你说得对,我没想过要同时切换两者。但是你必须把论据放在括号里。
      【解决方案4】:

      你可以先把你不想要的东西拿出来:

      my_array.values_at(0...i,(i+1)..-1).inject {|rs,item| rs += item}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 2012-07-08
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多