Arrays 在ruby中拆分和重构数组

Arrays 在ruby中拆分和重构数组,arrays,ruby,sorting,Arrays,Ruby,Sorting,我有一个数组,像这样:['host1','3','1','12','host2','4','1','5','1','host3','35','1',…]等等 问题是-如何在下一步中重新构造此阵列: ['host1',['3','1','12','host2',[…]] 或者像杂烩 {'host1'=>['3'、'1'、'12']、'host2'=>[…]} 谢谢假设您的密钥以非数字开头(编辑:但您应该明确说明,正如@tadman所问): 编辑:正如@Stefan所说,这是更短的: result_

我有一个数组,像这样:
['host1','3','1','12','host2','4','1','5','1','host3','35','1',…]等等

问题是-如何在下一步中重新构造此阵列:

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

或者像杂烩

{'host1'=>['3'、'1'、'12']、'host2'=>[…]}


谢谢

假设您的密钥以非数字开头(编辑:但您应该明确说明,正如@tadman所问):

编辑:正如@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"]] 

这里有一种可能的方法来构建您的第一个期望输出:

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"]]
如果需要,您可以使用
散列[*result]
从中获取散列

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"]}
之后

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

其余的计算结果类似。

第一个问题:您尝试了什么?什么定义了这里的分离?为什么要匆忙选择答案?其他人(不是我)可能还在努力寻找答案。很高兴认识你,老兵!他们正在寻找即时答案,实施、质量等对他们来说并不重要。你知道,@CarySwoveland,他们只是想要性,为爱而努力不是他们的交易-)相当于你散列的数组是
['host1',['3','1','12']],['host2',[…]]
不需要块,只要
在(/^\D/)之前切片就可以了

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