【问题标题】:Sorting by hash values inside an array of hashes按哈希数组中的哈希值排序
【发布时间】:2014-10-27 01:37:18
【问题描述】:

我试图从最低到最高的哈希数组中返回一个值列表。我正在使用 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


    【解决方案1】:

    首先,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 }
    

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

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

    【讨论】:

    • 所以我之前尝试过 bang 方法,尽管您上面的解释有很大帮助,但它仍然返回一个无序列表的值:413、516、435、410、540 等。有没有我需要添加的块内的比较?现在我有这个:@quarterbacks.sort_by!{|qb|放 qb[:dpp].to_f 如果 qb[:dpp].to_f > 0 }
    • (1) 去掉puts,你的块总是返回nil,因为它是对puts的调用。 (2)为什么你的块中有条件?如果您提供示例数据可能会有所帮助。
    【解决方案2】:

    试试这个

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

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

    上面的代码将通过每个Hash:dpp 属性对Hashes 的Array 进行排序,这似乎是您所要求的。在这种情况下,! 意味着它将改变接收者,从而将@quarterbacks 实例变量更改为就地排序。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2013-12-04
      • 2011-03-10
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多