【问题标题】:Duplicate keys of hash in rubyruby中哈希的重复键
【发布时间】:2021-11-03 00:10:18
【问题描述】:

我知道哈希不会存储重复的键。但我想知道是否可以根据要求更改默认行为,这可能吗? 我这里给出示例代码

keys_array =  [ 'key1', 'key2' ]
values_array = [
       {"A": { "id": "1"   }},
       {"B": { "id": "2"   }}
       ]
results = keys_array.zip(values_array ).to_h

这里的输出正是我想要的 {"key1"=>{:A=>{:id=>"1"}}, "key2"=>{:B=>{:id=>"2"}}}

但是如果键重复,例如

keys_array =  [ 'key1', 'key1' ] in which 'key1' key is repeated,
result will be {"key1"=>{:B=>{:id=>"2"}}}

但我想要 {"key1"=>{:A=>{:id=>"1"}}, "key1"=>{:B=>{:id=>"2"}}} 我知道分组和所有,但它会改变结果格式 所以我不想用那个

我想要这个结果 {"key1"=>{:A=>{:id=>"1"}}, "key1"=>{:B=>{:id=>"2"}}} 其中 key1 是一个重复的键。 另请注意,这些数组值不是固定的,它是动态的

非常感谢您的帮助!

【问题讨论】:

  • 哈希键,根据定义,是唯一的。 Ruby 是一种相当动态的语言,所以我不排除有一种方法可以做你想做的事,但你可能想考虑一种方法来实现你的目标,而无需尝试改变这种基本行为。
  • 正如你已经写的那样哈希不存储重复的键。无法更改此行为。
  • 问题:假设有可能,如果有两个元素具有完全相同的键,您将如何通过键访问散列的元素?哪一个会优先?或者您想以“循环顺序”接收它们?只需使用数组来存储具有相同键的元素与具有不同索引的元素即可。问题没有多大意义。
  • 这听起来更像是你想要一个字符串散列到一个对象数组。最终,多个相同的密钥毫无意义(即使您做了一些危险的事情以使其看起来相同),因为除非您拥有原始数据来重建危险的密钥,否则您将无法再次访问它们,这意味着您不需要哈希。

标签: arrays ruby-on-rails ruby hash


【解决方案1】:

您可以使用compare_by_identity 更改哈希的行为。

h = Hash.new.compare_by_identity
h["key1"] = 1
h["key1"] = 2
p h #=> {"key1"=>1, "key1"=>2}

我从未见过有用的方法。

【讨论】:

  • 我特别喜欢你的结束语。
  • 不过,这不是重复键。这仍然是两个不同的键。
【解决方案2】:

您正在寻找的数据结构称为multimap。当然,也可以在 Ruby 中实现一个。你只需要这样做。 (或者找一个为你做这件事的图书馆。)

但是,核心库和标准库都不包含多映射实现。

【讨论】:

    【解决方案3】:

    没有办法用哈希,你可以使用一个哈希数组来代替:

    [{"key1"=>{:A=>{:id=>"1"}}}, {"key1"=>{:B=>{:id=>"2"}}}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2011-06-01
      • 2016-01-02
      • 2011-12-28
      • 2011-06-30
      • 2013-07-20
      • 2014-11-13
      相关资源
      最近更新 更多