2016-11-22 98 views
0

可以說我有一個散列中的數字@assortment,例如, 1至100. @assortment中的每個號碼可以具有:free:used的狀態。通過分割散列創建多個陣列

一個例子@assortment可以是: {1 =>:免費,2 =>:免費,3 =>:使用等...}

可以說,我想基於所述最多分裂@assortment使用的數字,並提取遊離號碼到他們自己散列(或陣列或哈希?)

例如,對於爲1的@assortment到100中,如果數字25和75分別「使用」和其餘均'free',那麼結果將是所有自由值的3個新哈希:

1 to 24 
26 to 74 
76 to 100 

同樣,假設我們有一個不同的@assortmen t,數字爲1到100,但我想提取數字20到80,但是使用數字30,31,32和40,則結果如下所示:

hash1 -> 20 to 29 
hash2 ->33 to 39 
hash3 -> 41 to 80 

是否有一個很好的功能性的方式在Ruby中,在那裏我可以在號碼的完整@assortment通過這樣做,和一個可選的範圍來提取和獲得所產生的哈希值,也許在一個數組?

我想原來的哈希被打散或者基於:used元件分開......

如果通過哈希是循環,然後每一個免費電話號碼將被添加到一個新的哈希(如HASH1)直到你達到一個使用的數字。繼續循環直到你獲得一個空閒號碼,這個和所有後續的免費號碼被添加到一個新的散列(hash2)中。保持此下去,直到你把所有的免費電話號碼在新的哈希...

+2

您可以添加一些Ruby格式的示例數據嗎?從你的問題來看,不清楚輸入和輸出是什麼。你的意思是像'{1 =>:free,2 =>:used,...}'? – tadman

+0

是的,假設它是這種格式,我會加上 – user3437721

+0

這個問題,並且添加預期的輸出格式,它有很大的幫助。 – tadman

回答

2
@assortment = (20..50).to_a.product([:free]).to_h 
[30,31,32,40].each { |n| @assortment[n] = :used } 
@assortment 
    # => {20=>:free, 21=>:free, 22=>:free, 23=>:free, 24=>:free, 25=>:free, 
    #  26=>:free, 27=>:free, 28=>:free, 29=>:free, 30=>:used, 31=>:used, 
    #  32=>:used, 33=>:free, 34=>:free, 35=>:free, 36=>:free, 37=>:free, 
    #  38=>:free, 39=>:free, 40=>:used, 41=>:free, 42=>:free, 43=>:free, 
    #  44=>:free, 45=>:free, 46=>:free, 47=>:free, 48=>:free, 49=>:free, 50=>:free} 

返回哈希

@assortment.reject { |_,v| v == :used }. 
      slice_when { |(a,_),(b,_)| b > a+1 }. 
      to_a. 
      map(&:to_h) 
    #=> [{20=>:free, 21=>:free,...29=>:free}, 
    # {33=>:free, 34=>:free,...39=>:free}, 
    # {41=>:free, 42=>:free,...50=>:free}] 

數組見Hash#reject(返回哈希)和Enumerable#slice_when

返回數組

有一個哈希其值都是一樣的似乎不是很有用的數組。如果你希望返回一個數組數組,只需放下to_h即可。

arr = @assortment.reject { |_,v| v == :used }. 
      keys. 
      slice_when { |a,b| b > a+1 }. 
      to_a 
    #=> [[20, 21, 22, 23, 24, 25, 26, 27, 28, 29], 
    # [33, 34, 35, 36, 37, 38, 39], 
    # [41, 42, 43, 44, 45, 46, 47, 48, 49, 50]] 

返回範圍

的陣列第三種選擇是返回範圍的陣列。要做到這一點每個arr的元件(陣列)的映射到範圍:

arr.map { |f,*_,l| f..l } 
    #=> [20..29, 33..39, 41..50] 

arr傳遞到塊中的第一個元素是[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]。三個塊變量使用平行assignement計算:

f,*b,l = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 
f #=> 20 
_ #=> [21, 22, 23, 24, 25, 26, 27, 28] 
l #=> 29 

我想強調的是,我使用下劃線用於第二塊變量強調,它未在塊計算中使用。

+0

看起來不錯!如果@assortment在rails中是一個活動記錄結果,這會有很大的不同,所以我認爲這是一個數組,其中的每個元素都是屬性的哈希值:number =>「1」,:status =>「free」 ....我想我將活動記錄結果轉換爲哈希,請參閱http://api.rubyonrails.org/classes/ActiveRecord/Result.html – user3437721

+0

中的示例所以我想這應該是一個哈希數組,比散列。這需要迭代嗎?或者它可能會變平坦 – user3437721

+0

我不知道Rails,所以也許讀者可以回答第一個問題。如果我返回了一列哈希值,哈希值是什麼樣的?所有的值都是':free'嗎? –