ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组)

标签 ruby data-structures hash sorting

我有以下哈希:

user = {
  'user' => {
    'title' => {'weight' => 1, .... }
    'body' => {'weight' => 4, ....}
     ....
     ....
  }
}

是否可以让用户按其子哈希的权重键排序?

我查看了 Hash.sort,但看起来它返回的是数组而不是我原来的哈希排序。

最佳答案

在 Ruby 1.9 中,Hashes 被排序,但是 Hash#sort 仍然返回 ArrayArray秒。想象一下!它确实意味着您可以在此基础上构建自己的排序方法。

class Hash
  def sorted_hash(&block)
    self.class[sort(&block)]   # Hash[ [[key1, value1], [key2, value2]] ]
  end
end

Hashes 在 Ruby 1.8 中是未排序的。如果你想要 Ruby 1.8 兼容性,你可以使用 ActiveSupport 的 OrderedHash .它的行为类似于 1.9-Hash,因此您可以在其上定义相同的 sorted_hash 方法:

class ActiveSupport::OrderedHash
  def sorted_hash(&block)
    self.class[sort(&block)]
  end
end

hash = ActiveSupport::OrderedHash.new
hash["b"] = "b"
hash["a"] = "a"
hash               #=> {"b"=>"b", "a"=>"a"}  => unsorted
hash.sorted_hash   #=> {"a"=>"a", "b"=>"b"}  => sorted!

您必须将 sorted_hash 方法复制到您的代码中,因为默认情况下它不存在!

深度排序更新: 如果您希望对散列键之外的其他内容进行排序,请将一个 block 传递给 sorted_hash 方法,如下所示(假设从上面实现):

hash = ActiveSupport::OrderedHash.new
hash["a"] = { "attr" => "2", "..." => "..." }
hash["b"] = { "attr" => "1", "..." => "..." }

# Unsorted.
hash 
  #=> {"a"=>{"attr"=>"2", "..."=>"..."}, "b"=>{"attr"=>"1", "..."=>"..."}}

# Sort on the "attr" key. (Assuming every value is a Hash itself!)
hash.sorted_hash { |a, b| a[1]["attr"] <=> b[1]["attr"] }
  #=> {"b"=>{"attr"=>"1", "..."=>"..."}, "a"=>{"attr"=>"2", "..."=>"..."}}

关于ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983444/

相关文章:

ruby - 为什么我的单衬 block 不起作用?

ruby - 文本文件解析

ruby-on-rails - capybara rspec 匹配器相当于 response.should have_selector "form", :action => some_path

ruby - 如何使用 pager 制作 ruby​​ 命令行应用程序?

java - 随机访问链表的数据结构

git - 如何获取在预接收 Hook 中提交的所有哈希值?

javascript - rails observe_field 使用 ActionView Helpers

java - Java 中的 JSON 解析和数据操作

c++ - LRU缓存和快速定位对象常用哪些数据结构?

java - Java哈希表中的哈希