RUBY - 在一系列哈希中找到最常用的药物名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RUBY - 在一系列哈希中找到最常用的药物名称相关的知识,希望对你有一定的参考价值。

我需要在哈希数组中获得最常用的药物名称。

数组数据是:

Medicine.create([{name: "Apixibucil", patient_id: 1, review_id: 17, nurse_id: 2},
  {name: "Adriacilin", patient_id: 1, review_id: 17, nurse_id: 12},
  {name: "Tiaferol", patient_id: 4, review_id: 2, nurse_id: 17},
  {name: "Afalinum", patient_id: 6, review_id: 7, nurse_id: 10},
  {name: "Afalinum", patient_id: 9, review_id: 9, nurse_id: 9},
  {name: "Afalinum", patient_id: 22, review_id: 13, nurse_id: 1}])

我写的代码是(该方法是CLI的一部分,这就是我包含它的原因):

def most_common_medicine_on_study
  puts "Do you want to know the most popular medicine in the study?"
  puts ">"
  input = gets.chomp
  if input == "yes" || "y"
    Medicine["data"].each do |meds|
      meds["name"].max_by {|name| name.length}
    end
  end
end
答案

使用有效的Ruby数组:

medicine = [{name: "Apixibucil", patient_id: 1, review_id: 17, nurse_id: 2},
            {name: "Adriacilin", patient_id: 1, review_id: 17, nurse_id: 12},
            {name: "Tiaferol", patient_id: 4, review_id: 2, nurse_id: 17},
            {name: "Afalinum", patient_id: 6, review_id: 7, nurse_id: 10},
            {name: "Afalinum", patient_id: 9, review_id: 9, nurse_id: 9},
            {name: "Afalinum", patient_id: 22, review_id: 13, nurse_id: 1}]

你可以使用Enumerable#group_byHash#transform_values

medicine.group_by{ |h| h[:name] }.transform_values { |v| v.size}.max_by { |_, v| v }

或者使用Enumerable#each_with_object使用Hash#new默认为0,以便计算:

medicine.each_with_object(Hash.new(0)) { |h, o| o[h[:name]] += 1 }.max_by { |_, v| v }

两种方式都使用Enumerable#max_by来获取最大数量,返回:

["Afalinum", 3]


If you are using Rails check calculations, maybe you can do:
Medicine.group(:name).count
# => { 'Apixibucil' => 1, 'Adriacilin' => 1, 'Tiaferol' => 1, 'Afalinum' => 3 }
另一答案

这是一个解决方案。

Medicine['data'].reduce Hash.new(0) do |count, med|
  count[med[:name]] += 1
  count
end.max_by(&:last)

#=> ["Afalinum", 3]

1)减少哈希值,其中所有值都默认为0。

2)计算每个med名称的出现次数。

3)从柜台返回最大数量。

Benchmarked

为了让每个人都了解所提出的方法的性能运行情况,这里是速度和内存使用的输出。为了运行测试,我复制了数据以拥有大约3,000,000个条目。

benchmarker do
  result = data.reduce Hash.new(0) do |count, med|
    count[med[:name]] += 1
    count
  end.max_by(&:last)

  puts result
end
#=> [Afalinum, 1500000]
#=> {"ruby":"2.5.1","elapsed_time":0.72,"garbage_collection":"on","memory_used":"0 MB","garbage_collection_count":1}

benchmarker do
  result = data.each_with_object(Hash.new(0)) { |h, o| o[h[:name]] += 1 }.max_by { |_, v| v }

  puts result
end
#=> [Afalinum, 1500000]
#=> {"ruby":"2.5.1","elapsed_time":0.72,"garbage_collection":"on","memory_used":"0 MB","garbage_collection_count":1}

benchmarker do
  result = data.group_by { |h| h[:name] }.transform_values { |v| v.size}.max_by { |_, v| v }

  puts result
end
#=> [Afalinum, 1500000]
#=> {"ruby":"2.5.1","elapsed_time":0.52,"garbage_collection":"on","memory_used":"18 MB","garbage_collection_count":2}

我发现有趣的是,group_by方法实际上更快地处理了计算,尽管耗尽了大量的内存来实现这一点。第一个字面意思相同,让开发人员选择哪些更具可读性。

以上是关于RUBY - 在一系列哈希中找到最常用的药物名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中复制哈希?

当我尝试从 ruby​​ on rails 上的表单获取输入时,我得到了简单名称的哈希数组瞬间。如何解决?

如何优雅地重命名 Ruby 中哈希中的所有键? [复制]

InnoDB 索引

如何将哈希保存到 CSV

Ruby 哈希是不是可以包含在 Sass 和 CoffeeScript 中,从而允许共享数据?