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

问题描述 投票:0回答:2

我试图从最低到最高的哈希数组中返回一个值列表。我正在使用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] }
ruby arrays sorting hash rubygems
2个回答
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] }

2
投票

试试这个

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

你正试图对Array进行排序。现在你传递Hash(k)和nil(v),因为每个四分卫都存储为Hash所以key => value中没有Array关联。也将把回归nil所以你告诉它重复nilnil

上面的代码将按照每个ArrayHash属性对:dppHash进行排序,这看起来就像你要求的那样。在这种情况下,!意味着它将改变接收器改变@quarterbacks实例变量以进行分类。

© www.soinside.com 2019 - 2024. All rights reserved.