2014-09-02 146 views
0

我试图从一个散列数组中返回一列数值,从最低到最高。我现在用的是google_drive宝石从谷歌电子表格拉号码,显示足球信息:通过散列数组中的散列值进行排序

这是我在哪里:

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方法,只是没有运气安排好自己的键值

SOLUTION:

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

回答

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 } 

所以你的块需要返回的东西明智的,而不是nilputs回报:

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

,所以我尝试了bang方法之前,即使你上面的解释帮助了很多,它仍然会返回一个无序的值列表:413,516,435,410,540等。在我需要添加的块内部有某种比较吗?现在我有这个:@ quarterbacks.sort_by!{| qb |如果qb [:dpp] .to_f> 0}则放入qb [:dpp] .to_f – 2014-09-02 18:42:30

+2

(1)摆脱'puts',你的块总是返回'nil',因为它是对'puts'的调用。 (2)为什么你的区块有条件?如果您提供了样本数据,这可能会有所帮助。 – 2014-09-02 18:44:54

2

试试这个

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

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

上面的代码将的Hash es按Hash:dpp属性排序,这似乎是你所要求的。在这种情况下的!意味着它将改变接收者改变@quarterbacks实例变量以就地排序。