在哈希数组中按哈希值排序

时间:2014-09-02 17:45:27

标签: ruby arrays sorting hash rubygems

我试图返回从最低到最高的哈希数组内的值列表。我正在使用google_drive gem从谷歌电子表格中提取数字,显示足球信息:

我在这里:

require 'rubygems'
require 'google_drive'

session = GoogleDrive.login("EMAIL", "PASS")




v_qb_w1 =  session.spreadsheet_by_key("xxxxxxxx").worksheets[0]

@quarterbacks = [ 

                { name: v_qb_w1[2, 1], projection: v_qb_w1[2, 2], salary: v_qb_w1[2, 3], dpp: v_qb_w1[2, 4], ppd: v_qb_w1[2, 5] },
                { name: v_qb_w1[3, 1], projection: v_qb_w1[3, 2], salary: v_qb_w1[3, 3], dpp: v_qb_w1[3, 4], ppd: v_qb_w1[3, 5] }, 
                { name: v_qb_w1[4, 1], projection: v_qb_w1[4, 2], salary: v_qb_w1[4, 3], dpp: v_qb_w1[4, 4], ppd: v_qb_w1[4, 5] }
                                      ]

puts "Value:"
@quarterbacks.sort_by do |key, value| 
 dpp = []
 dpp << key[:dpp].to_f.to_s
 puts dpp.flatten.sort.reverse
end

最后一个块只是我试图尝试将dpp键值从最低到最高排序的尝试之一。没有什么失败,它只是没有改变任何东西。我已经尝试了grouby_by方法,但没有运气安排我的关键值

解决方案:

@quarterbacks.sort_by! { |qb| qb[:dpp] }
@quarterbacks.each { |qb| puts qb[:dpp] }

2 个答案:

答案 0 :(得分:2)

试试这个

@quarterbacks.sort_by!{|qb| qb[:dpp]}

您正在尝试对Array进行排序。现在你传递Hash(k)和nil(v),因为每个四分卫都存储为Hash,因此key => value中没有Array关联}。此外,puts会返回nil,因此您要告诉它重复nilnil的排序。

上面的代码会根据每个Array的{​​{1}}属性对Hash :dppHash进行排序,这似乎就像您要求的那样。在这种情况下,!意味着它将改变接收器改变@quarterbacks实例变量以进行适当的排序。

答案 1 :(得分:2)

首先,sort_by 返回排序列表,它不会对其进行排序。这意味着:

@quarterbacks.sort_by { ... }

没有做任何有用的事情,因为你丢弃了排序的结果。您需要添加作业或使用sort_by!

@quarterbacks = @quarterbacks.sort_by { ... }
# or
@quarterbacks.sort_by! { ... }

然后您已了解sort_by块的工作原理。 sort_by使用块的返回值进行排序,它或多或少是这样的:

array.map  { |e| [ sort_by_block_value[e], e ] }
     .sort { |a, b| a.first <=> b.first }
     .map  { |e| e.last }

所以你的块需要返回一些合理的东西而不是nil返回的puts

@quarterbacks.sort_by! { |q| q[:dpp] }