2016-08-18 103 views
0

我試圖計算所有項目數量爲[: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

回答

1

您可以使用此:

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://stackoverflow.com/a/14672305/177665),'each_with_object'將直接與數組的每個值一起工作,而'each.with_object'構造將首先返回一個枚舉器('each '部分),然後在枚舉器上調用'with_object'。 – cbliard

1

事情是這樣的:

subscriptions.group_by { |h| h[:item_id] }.map { |k,v| [k, v.length] }.to_h