为什么我的Ruby频率哈希没有增加值?

时间:2014-03-29 07:22:02

标签: ruby arrays hash frequency

我试图使用频率哈希来查找数组中值的频率。但是,我的频率哈希不能正确地对数组项进行分组 - 它们只被计算一次。这是我的代码:

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}

有谁可以告诉我为什么每个键都被计算一次,而不是返回一个频率?

3 个答案:

答案 0 :(得分:0)

arrfreq对象是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