我有一个返回像这样的哈希设置的方法
{
user_id => { date => count, date => count },
user_id => { date => count, date => count }
}
我如何以最高排名来订购此列表?
编辑:抱歉,我没有具体,我有一个日期和值的哈希值。我想获得最近一个月的最高排名。
my_hash = {
3 => {
"2013-07-01 00:00:00+00" => 1
},
6 => {
"2013-06-01 00:00:00+00" => 1,
"2013-07-01 00:00:00+00" => 2
},
5 => {
"2013-06-01 00:00:00+00" => 2,
"2013-07-01 00:00:00+00" => 5
}
}
答案 0 :(得分:4)
这样的事情应该有效:
hash = {
1 => { 'a' => 2, 'b' => 4 },
2 => { 'c' => 6, 'd' => 12 },
3 => { 'e' => 8, 'f' => 10 }
}
Hash[hash.sort_by { |user_id, date_counts| date_counts.values.max }.reverse!]
#=> {2=>{"c"=>6, "d"=>12}, 3=>{"e"=>8, "f"=>10}, 1=>{"a"=>2, "b"=>4}}
<强>更新强>
这会提取date
- count
对,并将它们从最高到最低排序:
sorted = my_hash.values.flat_map(&:to_a).sort.reverse
#=> [["2013-07-01 00:00:00+00", 5], ["2013-07-01 00:00:00+00", 2], ["2013-07-01 00:00:00+00", 1], ["2013-06-01 00:00:00+00", 2], ["2013-06-01 00:00:00+00", 1]]
第一个是具有最高计数的最近日期:
sorted.first[1] # => 5
答案 1 :(得分:2)
我认为Enumerable#max_by
对于同一个人来说是个不错的选择:
my_hash = {
3 => {
"2013-07-01 00:00:00+00" => 1
},
6 => {
"2013-06-01 00:00:00+00" => 1,
"2013-07-01 00:00:00+00" => 2
},
5 => {
"2013-06-01 00:00:00+00" => 2,
"2013-07-01 00:00:00+00" => 5
}
}
my_hash.max_by{|k,v| v.max_by{|k1,v1| [k1,v1]}}
# => [5, {"2013-06-01 00:00:00+00"=>2, "2013-07-01 00:00:00+00"=>5}]
#if you want user id of highest count for the the most recent month.
my_hash.max_by{|k,v| v.max_by{|k1,v1| [k1,v1]}}.first
# => 5
# highest count for the the most recent month.
my_hash.max_by{|k,v| v.max_by{|k1,v1| [k1,v1]}}[-1].values[-1]
# => 5