排序并获取散列的前五个值

时间:2014-08-21 14:12:36

标签: ruby

我有一个哈希,其键是唯一的,但值类似。我正在尝试检索前五个最高值的对。例如,从中:

{9=>1, 11=>1, 12=>2, 13=>1, 14=>1, 18=>1, 19=>1, 20=>1, 23=>1, 24=>2, 27=>1, 28=>1, 29=>1, 30=>1, 33=>1, 34=>1, 35=>1, 36=>1, 37=>1, 38=>1, 39=>1, 40=>1, 41=>1, 42=>1, 43=>1, 44=>1, 45=>1, 46=>1, 47=>1, 48=>1, 49=>1, 52=>1, 53=>1, 54=>1, 55=>1, 56=>1, 57=>1, 58=>1, 59=>1, 60=>1, 61=>1, 62=>1, 63=>1, 64=>1, 66=>1, 67=>1, 68=>1, 69=>1, 70=>2, 72=>1}

我首先想要这些值

=> 12=>2, 24=>2, 70=>2, ???

我不知道如何执行此操作,因为有三个实例的值为2。如果红宝石完全相同,那红宝石将如何确定下一个值是什么?

我有这个解决方案

@common_locations.max { |a,b| a.last() <=> b.last() }

但这只给了我一个例子。我如何收集五个?

1 个答案:

答案 0 :(得分:1)

这样可行:

hash = {9=>1, 11=>1, 12=>2, 13=>1, 14=>1, 18=>1, 19=>1, 20=>1, 23=>1, 24=>2, 27=>1, 28=>1, 29=>1, 30=>1, 33=>1, 34=>1, 35=>1, 36=>1, 37=>1, 38=>1, 39=>1, 40=>1, 41=>1, 42=>1, 43=>1, 44=>1, 45=>1, 46=>1, 47=>1, 48=>1, 49=>1, 52=>1, 53=>1, 54=>1, 55=>1, 56=>1, 57=>1, 58=>1, 59=>1, 60=>1, 61=>1, 62=>1, 63=>1, 64=>1, 66=>1, 67=>1, 68=>1, 69=>1, 70=>2, 72=>1}

hash.sort_by { |k, v| v }.reverse.first(5).to_h
#=> {12=>2, 70=>2, 24=>2, 44=>1, 67=>1}

如果您的值是数字,则可以将sort_by { |k, v| v }.reverse替换为sort_by { |k, v| -v }

请注意,在Ruby 2.1中引入了Array#to_h;对于旧版本,您必须使用Hash[hash.sort_by...first(5)]代替。