【问题标题】:Split and restructure an array in ruby在 ruby​​ 中拆分和重组数组
【发布时间】:2016-12-06 05:38:31
【问题描述】:

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

问题是——接下来我该如何重构这个数组:

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

或喜欢哈希

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

谢谢

【问题讨论】:

  • 第一个问题:你尝试过什么?这里的分离定义是什么?
  • 为什么急于选择答案?其他人(不是我)很可能仍在研究他们的答案。
  • 很高兴认识你,老手!他们正在寻找即时答案,实施、质量等对他们来说并不重要。你知道,@CarySwoveland,他们只是想要性,为爱而努力不是他们的交易 -))
  • 相当于你的哈希的数组是[['host1', ['3','1','12']], ['host2', [...]]]

标签: arrays ruby sorting


【解决方案1】:

假设您的密钥将以非数字开头(编辑:但您绝对应该澄清,正如@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"]] 

【讨论】:

  • 不需要块,只需slice_before(/^\D/)
【解决方案2】:

这是构建您的第一个所需输出的一种可能方法:

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] 获取哈希。

【讨论】:

    【解决方案3】:
    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 &lt;&lt; s

    当 arr 的第一个元素被传递到块中,并且块变量s 被设置为等于"host1",那么由于"host1"[0] =~ /\D/ #=&gt; 00 为真),初始空数组@987654332 @变成[["host1", []]

    接下来,"3" 被传递给块 (s #=&gt; "3"),因为"3"[0] =~ /\D/ #=&gt; nil,我们执行

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

    之后

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

    其余的计算类似。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 1970-01-01
      • 2014-11-05
      • 2021-03-23
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多