Ruby 如何在哈希数组中查找最频繁的值

Ruby 如何在哈希数组中查找最频繁的值,ruby,Ruby,我有一个有序的对象数组。我希望获得my数组中第一个最频繁的值,该值通常会获取一本书: orders = [ {'book' => '1', 'reader' => 'Denis' }, {'book' => '2', 'reader' => 'Mike' }, {'book' => '3', 'reader' => 'Denis' }, {'book' => '3', 'reader' =&

我有一个有序的对象数组。我希望获得my数组中第一个最频繁的值,该值通常会获取一本书:

orders = [
        {'book' => '1', 'reader' => 'Denis' },
        {'book' => '2', 'reader' => 'Mike' },
        {'book' => '3', 'reader' => 'Denis' },
        {'book' => '3', 'reader' => 'Mike' },
        {'book' => '5', 'reader' => '2' }
        ]
我尝试了这个方法,但它只适用于字符串数组:['string','string'…]:

预期结果:

=> "Denis"
orders.mode_by{|order| order['reader']}.first['reader']
#=> "Denis"
返回:

=> ["Denis", 2] 
我会这样做:

orders = [
  {'book' => '1', 'reader' => 'Denis' },
  {'book' => '2', 'reader' => 'Mike' },
  {'book' => '3', 'reader' => 'Denis' },
  {'book' => '3', 'reader' => 'Mike' },
  {'book' => '5', 'reader' => '2' }
]

orders.each_with_object(Hash.new(0)) { |order, hash| hash[order['reader']] += 1 }.max_by { |k, v| v } 
# => ["Denis", 2]
问题是,如果存在多个max,那么结果将根据数据的查找顺序返回。例如,如果顺序不同:

orders.push(orders.shift)
# => [{"book"=>"2", "reader"=>"Mike"},
#     {"book"=>"3", "reader"=>"Denis"},
#     {"book"=>"3", "reader"=>"Mike"},
#     {"book"=>"5", "reader"=>"2"},
#     {"book"=>"1", "reader"=>"Denis"}]
结果发生了变化:

orders.each_with_object(Hash.new(0)) { |order, hash| hash[order['reader']] += 1 }.max_by { |k, v| v } 
# => ["Mike", 2]

几天前我看到了这一点,并认为如果数组或枚举有一个mode_by,这将很容易!嗯,我终于抽空做了一个

通过 true mode_by可能会返回与块匹配的项的子数组:

orders.mode_by{|order| order['reader']}
#=> [{'book'=>'1', 'reader'=>'Denis'}, {'book'=>'3', 'reader'=>'Denis'}]
为了得到你想要的结果:

=> "Denis"
orders.mode_by{|order| order['reader']}.first['reader']
#=> "Denis"
因此,让我们通过以下方式来实现模式_:

定制的替代方案 在本例中,不需要返回数组元素。让我们通过实现返回您想要的内容(显示最多的块的第一个结果)来进一步简化。我们将其称为以下模式:

现在,您可以简单地执行以下操作:

orders.mode_of{|order| order['reader']}
#=> "Denis"
使用和:

输出:

 => "Denis"

预期的结果是什么?@Ilya,预期的1你的问题不清楚。最常见的读者价值1是什么意思?是否要访问哈希中的读取器值?是否要在数组中查找特定哈希?阅读并打开链接页面。我们需要知道您期望的返回值是:1还是散列?为什么1是最常见的?有2个1和2个2,那么为什么1比2更频繁呢?@theTinMan,但我强调我想在我的数组中获得第一个最频繁的值。如果要编辑这些问题,请检查是否已经有答案,否则我的回答将毫无意义。这个问题应该提前考虑好,写得简明扼要。根据对某个问题的评论,可以进行轻微澄清,但不可以更改问题的范围。这些帮助:它有助于记住,SO不是对asker站点的帮助,而是对asker站点之外的未来用户的帮助。提出问题的人必须提出一个对他人有用的问题,而不仅仅是对他们自己。
orders.mode_of{|order| order['reader']}
#=> "Denis"
orders.group_by { |h| h['reader']}.to_a.max_by {|x| x[1].length}.first
 => "Denis"