如何计算红宝石中的非唯一值哈希值
我试图计算所有项目数量为[:item_id]
且发生超过1次。这是我写的 - 我知道这是错误的。希望有人能指引我正确的方向!如何计算红宝石中的非唯一值哈希值
subscriptions = [
{user_id: 1, item_id: 3},
{user_id: 3, item_id: 2},
{user_id: 2, item_id: 3},
{user_id: 6, item_id: 5},
{user_id: 6, item_id: 2},
{user_id: 1, item_id: 4}
]
unique_id = subscriptions_list.map {|id| id[:item_id]} > 1 }
puts unique_id.count
您可以使用此:
subscriptions.each.with_object(Hash.new(0)) do |subscription, counts|
counts[subscription[:item_id]] += 1
end
# => {3=>2, 2=>2, 5=>1, 4=>1}
-
each
将遍历的subscription
每个元素, -
with_object
用于在迭代期间给出任意对象,并返回它, -
Hash.new(0)
创建一个默认值为0
的新散列。访问不哈希 -
counts[subscription[:item_id]] += 1
为重点subscription[:item_id]
存在将递增哈希值由一个有你的item_id
具有计数键时,返回此值。
真的需要将'each'和'with_object'分开吗?你不能这样做:'subscriptions.each_with_object(Hash.new(0)){| subscription,memo |备忘录[subscription [:item_id]] + = 1}' –
据我所知,可以同时使用'each_with_object'或'each.with_object'。这是一个品味问题。根据[这个答案](http://stackoverflow.com/a/14672305/177665),'each_with_object'将直接与数组的每个值一起工作,而'each.with_object'构造将首先返回一个枚举器('each '部分),然后在枚举器上调用'with_object'。 – cbliard
事情是这样的:
subscriptions.group_by { |h| h[:item_id] }.map { |k,v| [k, v.length] }.to_h
我会尝试'reduce'而不是map,并使用散列作为累加器,id作为键和整数作为值。 – philipp