【问题标题】:Sorting array of hashes in ruby在 ruby​​ 中对哈希数组进行排序
【发布时间】:2013-01-29 14:44:21
【问题描述】:

如果我有预先确定的顺序,我如何对哈希数组进行排序我有一个需要像这样排序的数组:

   array =  [{:attr_name=>:phone, :attr_value=>30}, {:attr_name=>:name, :attr_value=>20}, {:attr_name=>:similarity, :attr_value=>0}, {:attr_name=>:weight, :attr_value=>50}]

我有一个哈希值,我希望根据它对其进行排序:

pre_sorted = {
            :name => 0,
            :phone => 1,
            :weight=> 2,
            :similarity => 3
        }

排序后我的数组应该是这样的:

[{:attr_name=>:name, :attr_value=>20}, {:attr_name=>:phone, :attr_value=>30}, {:attr_name=>:weight, :attr_value=>50}, {:attr_name=>"similarity", :attr_value=>0}]

我查看了 ruby​​ sort and sort by docs 并在 So 上找到了相关问题,但无法弄清楚,因为我刚开始使用 rails。

【问题讨论】:

  • 为什么similarity在你的数组中是一个字符串,而在pre_sorted哈希中是一个符号?
  • @sepp2k 谢谢这是我的错字,我现在已经更正了

标签: ruby-on-rails ruby


【解决方案1】:

要按给定标准对数组进行排序,您可以使用sort_by。在您的情况下,您想按 pre_sorted 哈希中的条目进行排序,所以:

array.sort_by do |hash|
  pre_sorted[ hash[:attr_name] ]
end

【讨论】:

  • 嗨,感谢您的回答,当我使用您的方法时,我收到错误 comparison of Fixnum with nil failed
  • @GandalfStormCrow 如果给sort_by 的块返回nil,就会发生这种情况,在这种情况下,如果pre_sorted 不包含(至少)@987654328 之一的值,就会发生这种情况@s。但是,鉴于问题中的代码,这不应该发生(事实上也没有 - 我只是尝试过)。
【解决方案2】:

Array#sort 接受用于比较的代码块:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-sort

array.sort{|a,b| pre_sorted[a[:attr_value]] <=> pre_sorted[b[:attr_value]]}

【讨论】:

  • 当您开始不得不深入研究对象或结构以访问要比较的值时,您应该查看到达那里所需的成本,并认真考虑使用sort_by。要了解原因,请阅读“Schwartzian transform”,这是sort_by 使用的。 Randall Schwartz 有a page discussing it 以供阅读。
  • 嗯。我不知道 sort_by 中存在固有的优化。 Ruby 总能给我留下深刻印象。
  • 这不是 Ruby 优化,而是转换的好处。
猜你喜欢
  • 2014-03-05
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多