2016-12-06 38 views
-1

我有一個數組,如下所示:['host1', '3', '1', '12', 'host2', '4', '1', '5', '1', 'host3', '35', '1'...]等等。在ruby中拆分和重構數組

的問題是 - 我怎麼能在明年重組這個數組:

['host1', ['3','1','12'], 'host2', [...]]

或像散

{'host1' => ['3','1','12'], 'host2' => [...]}

感謝

+3

第一個問題:**您嘗試過什麼?**這裏定義了什麼? – tadman

+3

爲什麼急於選擇答案?其他人(不是我)可能仍在努力解答他們的答案。 –

+1

很高興認識你,老將!他們正在尋找即時答案,實施,質量等對他們來說並不重要。 你知道,@CarySwoveland,他們只是想要性,努力工作的愛不是他們的交易 - )) – marmeladze

回答

4

假設你的鑰匙將與啓動非數字(編輯:但你必須澄清,因爲@tadman問):

array = ['host1', '3', '1', '12', 'host2', '4', '1', '5', '1', 'host3', '35', '1'] 

result_array = array 
    .slice_before { |e| !e.match(/^\d/) } 
    .flat_map { |e| [e.shift, e] } 
# => ["host1", ["3", "1", "12"], "host2", ["4", "1", "5", "1"], "host3", ["35", "1"]] 

result_hash = Hash[*result_array] 
# => {"host1"=>["3", "1", "12"], "host2"=>["4", "1", "5", "1"], "host3"=>["35", "1"]} 

編輯:由於@Stefan說,這是更短:

result_array = array.slice_before(/^\D/).flat_map { |e| [e.shift, e] } 
# => ["host1", ["3", "1", "12"], "host2", ["4", "1", "5", "1"], "host3", ["35", "1"]] 
+2

不需要塊,只需'slice_before(/^\ D /)' – Stefan

3

下面是構建第一個期望的輸出一個可能的方法:

result = a. 
    chunk { |a| !!/^host/.match(a) }. 
    map { |bool, group| bool ? group.first : group } 
#=> ["host1", ["3", "1", "12"], "host2", ["4", "1", "5", "1"], "host3", ["35", "1"]] 

從那裏,你可以使用Hash[*result]獲得如果你需要散列。

2
arr = ['host1', '3', '1', '12', 'host2', '4', '1', '5', '1', 'host3', '35', '1'] 

arr.each_with_object([]) { |s,a| s[0] =~ /\D/ ? a << [s, []] : a.last.last << s }.to_h 
    #=> {"host1"=>["3", "1", "12"], "host2"=>["4", "1", "5", "1"], "host3"=>["35", "1"]} 

如果arr一個元件不以數字開頭(即,匹配/\D/)我們追加正在建造,a陣列,具有[s, []];否則,我們將s附加到剛創建的空數組中:a.last.last << s

當ARR的第一個元素被傳遞到塊,塊變量s被設置爲等於"host1",則由於"host1"[0] =~ /\D/ #=> 00是truthy)時,最初爲空數組a變得[["host1", []]

接着,"3"被傳遞到塊(s #=> "3"),並且由於"3"[0] =~ /\D/ #=> nil,我們執行

a.last.last << "3" 
    #=> ["host1", []].last << "3" 
    #=> [] << "3" 

之後

a #=> [["host1", ["3"]] 

剩餘計算是相似的。