【问题标题】:ruby sort hash based on another hash基于另一个哈希的红宝石排序哈希
【发布时间】:2015-01-14 23:02:16
【问题描述】:

我有以下两个哈希:

db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city"  }
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" }

我想根据 db 来排序 csv,如果 csv 中有任何键不在 db 中,那么我想将它们移动到 csv 的末尾,所以在上面的示例中结果如下所示:

{"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city", "7" => "address" }

由于键“7”不在 db hash 中,我们只是将其移至 csv hash 的末尾。

这是我尝试过的:

db = {"1" => "first_name", "2" => "last_name", "5" => "status", "10" => "city"  }
csv = {"1" => "first_name", "2" => "last_name", "5" => "status", "7" => "address", "10" => "city" }
rejects = csv.reject {|k| db.include? k }
result = csv.keep_if {|k,_| db.include? k }
result.merge!(rejects)
result   
=> {"1"=>"first_name", "2"=>"last_name", "5"=>"status", "10"=>"city", "7"=>"address"}

它似乎工作。但是能保证有效吗?合并是否总是将第二个哈希放在最后,或者合并是否有可能将哈希混合在一起而不考虑顺序?

【问题讨论】:

  • 您不需要对csv 中存在于db 中的键重新排序?
  • @sawa 在 db 中但不在 csv 中的键应附加到 csv 的末尾。 db中key的顺序无关紧要,但都必须在csv hash的末尾。
  • 我不是在问“在 db 中但不在 csv 中的键”,而是在问“在 db 中但在 csv 中的键”。
  • @sawa csv 中的键必须与 db 中键的顺序匹配。这是必须的,但是 db 中的额外内容可以被扔到 csv 的末尾并且顺序无关紧要,只要它们在两个哈希之间匹配的键之后。
  • 为什么要对哈希进行排序?它对你没有好处。取而代之的是,抓住键,按你想要的顺序排列它们,然后使用hash.values_at(*keys) 按你需要的顺序获取值。

标签: ruby


【解决方案1】:

您可以执行以下操作:

db_keys = db.keys
  #=> ["1", "2", "5", "10"] 
keys = db_keys + (csv.keys-db_keys)
  #=> ["1", "2", "5", "10", "7"] 
Hash[keys.zip(csv.values_at(*keys))]
  #=> { "1"=>"first_name", "2"=>"last_name", "5"=>"status",
  #    "10"=>"city", "7"=>"address"} 

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2011-08-10
    相关资源
    最近更新 更多