2013-07-04 88 views
-1

的哈希我有一个是返回一个哈希设置这样检索最大值的关键在hases

{ 
    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 
    } 
} 
+1

这些算不算?每个哈希值都有多个计数。你的意思是排序顶级散列或值散列? – jxpx777

回答

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}} 

UPDATE

这提取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]] 

第一一个是最近的日期与hightest计数:

sorted.first[1] # => 5 
+1

太棒了,非常感谢。我一定会从这里彻底提出我的问题。 – MattLock

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 
+0

很好,谢谢! – MattLock

+0

@MattLock很高兴为您效劳。 :)) –