如何计算红宝石中的非唯一值哈希值

如何计算红宝石中的非唯一值哈希值

问题描述:

我试图计算所有项目数量为[: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 
+0

我会尝试'reduce'而不是map,并使用散列作为累加器,id作为键和整数作为值。 – philipp

您可以使用此:

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具有计数键时,返回此值。

+0

真的需要将'each'和'with_object'分开吗?你不能这样做:'subscriptions.each_with_object(Hash.new(0)){| subscription,memo |备忘录[subscription [:item_id]] + = 1}' –

+1

据我所知,可以同时使用'each_with_object'或'each.with_object'。这是一个品味问题。根据[这个答案](http://*.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