例如,我有这些数据:
headings = { :heading1 => { :weight => 60,:show_count => 0} :heading2 => { :weight => 10,:show_count => 0} :heading3 => { :weight => 20,:show_count => 0} :heading4 => { :weight => 10,:show_count => 0} } total_views = 0
现在我想根据他们的体重为每个标题服务.例如,对于前10个请求/迭代,heading1,heading3,heading2和heading4将按顺序(按重量)分别提供6,2,1和1次.
对于每次迭代,服务标题的show_count将递增1,total_views也将全局递增.
解决方法
这应该适用于您的基本情况,可以根据您需要的细节进行修改:
class heading attr_reader :heading,:weight,:show_count def initialize(heading,weight=1) @heading=heading @weight=weight @show_count=0 end def serve puts "Served #{@heading}! " @show_count += 1 end end class headingServer attr_reader :headings def initialize(headings_hash) @headings=headings_hash.map {|h,data| heading.new(h,data[:weight])} @total_weight=@headings.inject(0) {|s,h| s+= h.weight} end def serve(num_to_serve=@total_weight) @headings.sort {|a,b| b.weight <=> a.weight}.each do |h| n = (h.weight * num_to_serve) / @total_weight #possibility of rounding errors n.times { h.serve } end end def total_views @headings.inject(0) {|s,h| s += h.show_count} end end headings = { :heading1 => { :weight => 60,:show_count => 0},:heading2 => { :weight => 10,:heading3 => { :weight => 20,:heading4 => { :weight => 10,:show_count => 0} } # Example Usage: hs = headingServer.new(headings) hs.serve(10) hs.headings.each {|h| puts "#{h.heading} : served #{h.show_count} times"} puts "Total Views: #{hs.total_views}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。