我怎么能将多个数组分组为哈希

时间:2015-08-06 07:19:04

标签: ruby

我想知道是否有更优雅的方式来实现我的目标。

输入数据

  • 所有用户:[1,2,3]

  • 所有产品:[4,5,7]

  • 查看历史记录[[1, 7],[2, 4], [1, 4], [1, 4]]

    • 每个项目表示哪个用户提供了哪个产品
    • 结构:[[USER_ID, PRODUCT_ID], [USER_ID, PRODUCT_ID], ..]

期望输出

{   
    1:{
        4:2,
        5:0,
        7:1,
    },
    2:{
        4:1,
        5:0,
        7:0,
    },    
    3:{
        4:0,
        5:0,
        7:0,
    }

}

{
    USER_ID:{
        PRODUCIT_ID: view_count
        ...
    },
    USER_ID:{
        PRODUCIT_ID: view_count,
        ...
    },
}

3 个答案:

答案 0 :(得分:1)

GAITracker.h

答案 1 :(得分:0)

使用Ruby 1.8.7尝试了一个简短的解决方案。

view_history = [[1, 7],[2, 4], [1, 4], [1, 4]] 
Hash[*view_history.group_by(&:first).
                   map { |k,v| [k,Hash[*v.group_by(&:last).
                                          map { |k,v| [k,v.size] }.
                                          flatten]] }.
                   flatten]
#=> {1=>{7=>1, 4=>2}, 2=>{4=>1}}

该解决方案不包含没有任何视图的产品。

答案 2 :(得分:0)

这是我的答案,但看起来很复杂

all_products = Product.all.pluck(:id).map{|c|[c,0]}.to_h
collaborative_matrix = view_history.group_by{|c| c.first}.collect do |user_id, raw_view_history|
  view_history = raw_view_history.collect{|c|c.last}
     .each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
  {
    user_id => view_history.merge(all_products) { |key, v1, v2| [v1, v2].max }
  }
end