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

剩余计算是相似的。