复杂的红宝石注入法

时间:2014-03-23 06:53:30

标签: ruby hash hashmap

似乎无法弄清楚这一点。请帮助我理解此代码请求的a变量以及预期输出的内容。提前谢谢!

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

2 个答案:

答案 0 :(得分:3)

假设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来更好地描述目的。

答案 1 :(得分:1)

它希望a成为一个数组,但是数组的构成并不重要,所以你需要一些其他的线索才能知道数组中应该是什么。

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

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