我试图使用频率哈希来查找数组中值的频率。但是,我的频率哈希不能正确地对数组项进行分组 - 它们只被计算一次。这是我的代码:
require 'time'
require 'date'
def peak_hours(reg_date)
arr = []
freq = Hash.new(0)
format = "%m/%d/%y %H:%M"
arr << DateTime.strptime(reg_date, format).hour
arr.each { |v| freq[v] += 1 }
puts freq
end
contents.each do |row|
reg_date = peak_hours(row[:regdate])
end
这是输出:
{10=>1}
{13=>1}
{13=>1}
{19=>1}
{11=>1}
{15=>1}
{16=>1}
{17=>1}
{1=>1}
{16=>1}
{18=>1}
{21=>1}
{11=>1}
{13=>1}
{20=>1}
{19=>1}
{21=>1}
{16=>1}
{20=>1}
有谁可以告诉我为什么每个键都被计算一次,而不是返回一个频率?
答案 0 :(得分:0)
arr
和freq
对象是peak_hours
方法的本地对象,因此只要方法结束,它们就会被销毁。看起来你正在为每个reg_date调用peak_hours
方法,并且每次调用它时它都会创建一个新数组和一个新的频率哈希,只在每个中放入一个值。
我认为你想要做的是在你循环reg_dates的任何地方之前调整你的频率哈希,然后在循环内更新每个reg_date的频率哈希。
答案 1 :(得分:0)
这是我在Jeremy Ruten评论的帮助下找到的解决方案。
def peak_hours(reg_date)
arr = []
format = "%m/%d/%y %H:%M"
arr << DateTime.strptime(reg_date, format).hour
end
freq = Hash.new(0)
contents.each do |row|
arr = []
reg_date = peak_hours(row[:regdate])
reg_date.each do |i|
arr << i
arr.each { |v| freq[v] += 1 }
end
end
puts freq
看起来很笨重所以欢迎任何建议。
答案 2 :(得分:0)
记得要正确缩进。试试这个是为了便于阅读:
def parse_date(date)
format = "%m/%d/%y %H:%M"
DateTime.strptime(date, format).hour
end
hours = contents.map { |row| parse_date(row[:regdate]) }
peak_hours = Hash.new(0)
hours.each { |hour| peak_hours[hour] += 1 }
p peak_hours