2014-03-29 74 views
0

我正在嘗試使用頻率散列來查找數組中值的頻率。但是,我的頻率散列不能正確分組數組項 - 它們都只被計數一次。這裏是我的代碼:爲什麼我的Ruby頻率散列值沒有添加值?

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

arrfreq對象是peak_hours方法的本地對象,因此只要方法結​​束,它們就會被銷燬。看起來你正在爲每個reg_date調用peak_hours方法,並且每次你調用它時,它都會創建一個新的數組和一個新的頻率哈希,並在每個哈希中只放一個值。

我想你要做的就是在你通過reg_dates循環的任何地方使你的頻率散列正確,然後在循環內更新每個reg_date的頻率散列。

+0

謝謝,我更新了代碼,以顯示我通過一個csv文件('內容')循環獲取reg_date。你能告訴我如何「在循環內更新每個reg_date的頻率哈希」嗎?看起來無論我把它放在哪裏,它都是無法訪問的,因爲它是一個局部變量,或者它被重新創建並消除了這個值。 – Car

+0

這有幫助。我會在下面發佈我的解決方案。這不是很優雅,所以如果你有建議,他們將不勝感激。 – Car

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 

它似乎有點笨重,所以任何建議,歡迎。

+0

很高興你的工作。它看起來笨重的原因是因爲有一個不必要的部分:'arr'數組。在數組重置之前,您只會將一件事放入數組中。我認爲你的'peak_hours'方法(在這一點上應該有一個不同的名字)應該使用reg_date並且返回它的小時。然後你的'contents.each'循環中應該只有兩行代碼:一個將當前行的regdate轉換爲一個小時,另一個將該小時的頻率散列值更新。 –

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 
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