2012-05-07 35 views
2

我需要一種基於當前日期和已使用日期計算可用星期的方法。計算ruby中的可用星期

我已經想出了不同的解決方案,但它們都似乎是Ruby的「醜陋」。我知道有更好的方法來做到這一點。

要求:

方法需要3個參數

start - Date, to start calculation from 

amount - Integer, How many weeks do we want? 

used_weeks - Array of already used weeknumbers (optional) Default: nil 

比方說我們通過方法是:

calculate_available_weeks (Date.current, 5, [1,3,7]) 

(比方說Date.current返回孫,2012 01一月爲簡單起見)

然後該方法應返回日期爲接下來的幾個星期:2,4,5,6,8

這裏是我到目前爲止有:

def calculate_week_dates(start, amount, excluded_weeks = nil) 
    weeks = [] 

    last_checked = start 
    until weeks.length == amount do 
    unless excluded_weeks && excluded_weeks.include?(last_checked.cweek) 
     weeks << last_checked 
    end 
    last_checked = last_checked.next_week 
    end 

    weeks 
end 
+0

您的示例輸出不同意您的代碼示例。您似乎在輸出中指定了cweek數字,但您的代碼在排除時會接受cweek,但會在其結果中生成日期而非週數。目前加上數週到明年的時間,你想得到什麼? – dbenhur

回答

1

這就是爲什麼我喜歡紅寶石。

def calculate(starting_week, amount, excluded_weeks = []) 
    ((starting_week..52).to_a - excluded_weeks).first(amount) 
end 

puts calculate(1, 5, [1,3,7]).inspect # => [2, 4, 5, 6, 8] 
puts calculate(5, 5, [1,3,7]).inspect # => [5, 6, 8, 9, 10] 
puts calculate(10, 5, [1,3,7]).inspect # => [10, 11, 12, 13, 14] 
+0

當start_week + amount + excluded_weeks.size換到下一年時會發生什麼? – dbenhur

+0

它不起作用。 @Tim:是否需要包裝? – iblue

+0

@iblue:是的,這就是爲什麼我將開始作爲日期傳遞,儘管其他計算不錯! –

1

好吧,你可以做鏈接功能統計員:

def calculate_week_dates(start, amount, excluded_weeks = []) 
    (0 ... amount + excluded_weeks.size). 
    inject([start]) {|a,wk| a << a.last.next_week }. 
    reject {|wk| excluded_weeks.include? wk.cweek }. 
    first(amount) 
end 

但我的感覺混合這是不是一個累加循環更清晰或更漂亮。無論哪種情況,最好斷言excluded_weeks是一個空數組,而不是零,以避免後來的nil守衛想要使用它。

相關問題