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

这样的东西应该可以工作:

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

我认为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

最新更新