【问题标题】:Writing values in hash to an array in a specific order以特定顺序将哈希值写入数组
【发布时间】:2014-07-09 17:36:03
【问题描述】:

所以我有一堆看起来像这样的哈希

{
 "key1"=>"value1", 
 "key2"=>"value2", 
 "key4"=>"value4"
}

{
 "key1"=>"value1", 
 "key3"=>"value3", 
 "key4"=>"value4"
}

如您所见,并非所有哈希都具有所有键。除此之外,我需要得到一个包含所有值的数组,并用字符串“未列出”代替所有缺失值。

我开始写一些这样的代码:

result = []
i = 0
hash.each do |key, value|
    i+=1
    result << value if key == "key" + i.to_s
end

在我意识到这种策略行不通之前。有什么建议吗?

编辑:

第一个哈希的预期输出是

["value1", "value2", "Not Listed", "value4"]

第二个哈希是

["value1", "Not Listed", "value3", "value4"]

【问题讨论】:

  • 预期输出?给我看……
  • 您在这里使用什么样的数据大小?数百?数千?百万?
  • 每次运行脚本时都会有几十万到一百万。

标签: ruby arrays hash


【解决方案1】:

不清楚您如何知道应该有多少个键,但假设您应该有 4 个键,您可以执行以下操作:

h = {
 "key1"=>"value1", 
 "key2"=>"value2", 
 "key4"=>"value4"
}
(1..4).map { |i| h["key#{i}"] || 'Not Listed' }
#=> ["value1", "value2", "Not Listed", "value4"]

Arup 提出了不同的风格,使用fetch

(1..4).map { |i| h.fetch("key#{i}", 'Not Listed') }
#=> ["value1", "value2", "Not Listed", "value4"]

还有一个选择是使用Hashdefault 值:

h.default = 'Not Listed'
(1..4).map { |i| h["key#{i}"] }
#=> ["value1", "value2", "Not Listed", "value4"]

【讨论】:

  • Ruby方式(我最喜欢)-(1..4).map { |i| h.fetch("key#{i}", 'Not Listed') }
  • 我很沮丧,首先,现在我明白了,你使用了#fetch。 +1。我很高兴,
【解决方案2】:

使用默认的“未列出”初始化您的哈希,然后遍历您的输入以填充存在的值。

def solution(keys,default_val)
  Hash[keys.product([default_val])]
end
result = solution(["key1","key2", "key3", "key4"],"not listed")
hash.each do |key, value|
  result[key] = value 
end

print(result)

抱歉,刚刚复制了用户的内容。

【讨论】:

  • 您是否尝试运行此代码? - 它运行不正确。
  • 抱歉刚刚复制了用户的内容。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2016-04-09
  • 2012-05-15
  • 2019-02-12
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多