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_by
和Hash#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 - 在一系列哈希中找到最常用的药物名称的主要内容,如果未能解决你的问题,请参考以下文章