2016-10-11 49 views
1

我想知道如果有一種方法可以總結一下字符串表示多個時長像2 years 2 months10 months3 years和輸出6 years總結年份和月份持續時間的字符串表示紅寶石

+1

感謝greenie,但考慮將其刪除並作出選擇之前等待一段時間(至少一兩個小時,說了)。快速選擇會阻礙其他答案,並可能使正在解答問題的其他人短路。 –

回答

4

你可以做如下。

str = "2 years 4 months, 10 months, 3 years, 1 month" 

r =/
    (\d+)  # match one or more digits in capture group 1 
    \s+   # match one or more whitespace chars 
    (year|month) # match 'year' or 'month' in capture group 2 
    s?   # optionally match 's' 
    \b   # match a word break 
    /x   # free-spacing regex definition mode 

a = str.scan r 
    #=> [["2", "year"], ["4", "month"], ["10", "month"], ["3", "year"], ["1", "month"]] 

h = a.each_with_object(Hash.new(0)) { |(n,period),h| h[period] += n.to_i } 
    #=> {"year"=>5, "month"=>15} 
y, m = h["month"].divmod(12) 
    #=> [1, 3] 
h["year"] += y 
    #=> 6 
h["month"] = m 
    #=> 3 
h #=> {"year"=>6, "month"=>3} 

注:

  • 如在該文檔爲String#scan指出的那樣,「如果圖案包含基團,每個獨立的結果是本身含有每組一個條目的陣列。」
  • Hash.new(0)爲零的默認值會創建一個空的哈希值,這意味着如果該散列h沒有一個關鍵kh[k]返回零。 Thos有時被稱爲計數散列。請參閱文檔Hash::new
  • Numeric#divmod是一個有用的和大大-未充分利用的方法。
+0

功能要求:適用於單數月/年如'1年,1個月'。 –

+1

@ sagarpandya82,你的願望是我的命令。好建議。 –

+0

謝謝卡里。期待用我剩下的兩個願望。 –