2014-09-02 171 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實例變量以就地排序。

相關問題