Ruby 如何合并数组索引值并创建哈希

Ruby 如何合并数组索引值并创建哈希,ruby,Ruby,我试图通过使用一些匹配将数组转换为哈希。在将数组转换为散列之前,我希望像这样合并这些值 "Desc,X1XXSC,C,CCCC4524,xxxs,xswd" 并从中创建一个哈希。规则是,数组的第一个值是散列中的键,在数组中有重复键,对于这些键,我需要合并值并将其放在一个键下。“描述:”是钥匙。我的程序是这样的 p 'test sample application' str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524" arr = Array

我试图通过使用一些匹配将数组转换为哈希。在将数组转换为散列之前,我希望像这样合并这些值

 "Desc,X1XXSC,C,CCCC4524,xxxs,xswd"
并从中创建一个哈希。规则是,数组的第一个值是散列中的键,在数组中有重复键,对于这些键,我需要合并值并将其放在一个键下。“描述:”是钥匙。我的程序是这样的

 p 'test sample application'
 str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524"
 arr = Array.new
 arr = str.split(":")
 p arr
 test_hash = Hash[*arr]
 p test_hash
我找不到办法来解决它。如果有人能指引我,我会很感激的。

这是一个好办法

str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524"
a = ["Desc","C","xxxs"] # collect the keys in a separate collection.
str.split(":").slice_before(""){|i| a.include? i}
# => [["Desc", "X1"], ["C", "CCCC"], ["Desc", "XXSC"], ["xxxs", "xswd"], ["C", "4524"]]
hsh = str.split(":").slice_before(""){|i| a.include? i}.each_with_object(Hash.new("")) do |i,h|
  h[i[0]] += i[1]
end
hsh
# => {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}
这是一个好办法

str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524"
a = ["Desc","C","xxxs"] # collect the keys in a separate collection.
str.split(":").slice_before(""){|i| a.include? i}
# => [["Desc", "X1"], ["C", "CCCC"], ["Desc", "XXSC"], ["xxxs", "xswd"], ["C", "4524"]]
hsh = str.split(":").slice_before(""){|i| a.include? i}.each_with_object(Hash.new("")) do |i,h|
  h[i[0]] += i[1]
end
hsh
# => {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}

我相信你在这里找我


我相信你在这里找我

功能性方法,包括:

这并不是说没有方面你就做不到,而是因为核心缺少一些基本的抽象:

Hash[str.split(":").each_slice(2).group_by(&:first).map { |k, gs| [k, gs.map(&:last).join] }]
#=> {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}
功能性方法,包括:

这并不是说没有方面你就做不到,而是因为核心缺少一些基本的抽象:

Hash[str.split(":").each_slice(2).group_by(&:first).map { |k, gs| [k, gs.map(&:last).join] }]
#=> {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}

@Sergio Tulentsev溶液的一个小变化:

str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524"
str.split(':').each_slice(2).each_with_object(Hash.new{""}){|(k,v),h| h[k] += v}
# => {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}
  • str.split(“:”)
    生成一个数组;无需使用
    arr=Array.new进行初始化
    

  • 每个_切片(2)
    将此数组的元素两个接两个地馈送到一个块或其后面的方法,如本例所示

  • each_with_object
    获取这两个元素(作为一个数组),并将它们与一个对象一起传递到一个块中,该块由以下指定:

  • (Hash.new{“”})
    此对象是一个具有特殊行为的空哈希:当找不到键时,它将以“”值(而不是通常的nil)响应

  • {|(k,v),h | h[k]+=v}
    这是完成所有工作的代码块。它将包含两个元素的数组解构为两个字符串,分配给k和v;特殊散列被分配给h。h[k]向哈希询问键“Desc”的值。它以“”作为响应,其中添加了“X1”。重复此操作,直到处理完所有元素


关于@Sergio Tulentsev的解决方案的一个小变化:

str = "Desc:X1:C:CCCC:Desc:XXSC:xxxs:xswd:C:4524"
str.split(':').each_slice(2).each_with_object(Hash.new{""}){|(k,v),h| h[k] += v}
# => {"Desc"=>"X1XXSC", "C"=>"CCCC4524", "xxxs"=>"xswd"}
  • str.split(“:”)
    生成一个数组;无需使用
    arr=Array.new进行初始化
    

  • 每个_切片(2)
    将此数组的元素两个接两个地馈送到一个块或其后面的方法,如本例所示

  • each_with_object
    获取这两个元素(作为一个数组),并将它们与一个对象一起传递到一个块中,该块由以下指定:

  • (Hash.new{“”})
    此对象是一个具有特殊行为的空哈希:当找不到键时,它将以“”值(而不是通常的nil)响应

  • {|(k,v),h | h[k]+=v}
    这是完成所有工作的代码块。它将包含两个元素的数组解构为两个字符串,分配给k和v;特殊散列被分配给h。h[k]向哈希询问键“Desc”的值。它以“”作为响应,其中添加了“X1”。重复此操作,直到处理完所有元素


描述合并价值的规则请稍候,我将编辑描述合并价值的规则请稍候,我将编辑非常感谢。我将研究每个_切片和每个带_对象的_都做了什么。我还在学习core rubyThank,非常感谢你。我将研究每个_切片和每个带_对象的_都做了什么。我还在学习core rubyThank,非常感谢你。看来我有很多关于ruby的知识要学。谢谢:)@Kalanamith补充了一步一步的解释。非常感谢。看来我有很多关于ruby的知识要学。谢谢:)@Kalanamith添加了一步一步的解释。我们又做了一次,我的
每个带有对象的\u
与你的函数方法相比:)@Sergio:是的,我注意到;-)现在我们需要另一个带有
inject
,另一个带有
每个
的,我们又找到了通常的嫌疑犯:-)如果我们在核心中有
mash
,我想不会有讨论,但是
Hash[…]
是如此丑陋和反OOP,我知道没有人想使用它。我们又做了一次,我的
每个带有对象的\u
与你的函数方法相比:)@Sergio:是的,我注意到;-)现在我们需要另一个带有
inject
,另一个带有
每个
的,我们又把通常的嫌疑犯集中起来了:-)如果我们在核心中有
mash
,我想不会有讨论,但是
Hash[…]
是如此丑陋和反OOP,我知道没有人愿意使用它。