【问题标题】:Complicated ruby inject method复杂的红宝石注入方法
【发布时间】:2014-03-23 06:53:30
【问题描述】:

似乎无法弄清楚这一点。请帮助我了解此代码对 a 变量的要求以及预期的输出应该是什么。提前致谢!

def function_name(a)
  a.inject({}){ |a,b| a[b] = a[b].to_i + 1; a}.\
  reject{ |a,b| b == 1 }.keys
end

【问题讨论】:

    标签: ruby hash hashmap


    【解决方案1】:

    假设a是一个数组,

    该函数首先计算键的出现次数。

    a = ['a', 'b', 'c', 'b']
    a.inject({}) { |a,b|
      # a: a result hash, this is initially an empty hash (`{}` passed to inject)
      # b: each element of the array.
      a[b] = a[b].to_i + 1 # Increase count of the item
      a # The return value of this block is used as `a` argument of the block
        #   in the next iteration.
    }
    # => {"a"=>1, "b"=>2, "c"=>1}
    

    然后,它过滤多次出现的项目:

    ...reject{ |a,b|
      # a: key of the hash entry, b: value of the hash entry (count)
      b == 1 # entry that match this condition (occurred only once) is filtered out.
    }.keys
    # => ["b"]
    

    因此,应该使用像 get_duplicated_items 这样的函数名称而不是 function_name 来更好地描述用途。

    【讨论】:

    • 谢谢!这有帮助。我还有一个相关的问题。块结束时的周期是多少? "a}." 我发现如果我不包括这个方法就会失败。
    • @LelandSmith,这里的reject 返回一个哈希值。 .keys 仅用于获取哈希的键。 (.调用方法keys)
    • 对不起@falsetru 我指的是 .末尾_i + 1; a}. 再次感谢您的帮助!
    • @LelandSmith,reject 方法也是如此。尾随反斜杠 (\ ) 用于续行。
    【解决方案2】:

    它希望 a 成为一个数组,但数组由什么组成似乎并不重要,因此您需要一些其他线索来了解数组中应该包含什么。

    代码所做的是相当直接的前言。对于数组中的每个项目,它都将其用作散列中的键。然后它基本上计算它看到该密钥的次数。最后,它会删除所有只出现一次的项目。

    它返回数组 a 中出现 2 次或更多次的唯一项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2013-03-19
      • 2010-09-08
      相关资源
      最近更新 更多