2012-03-03 24 views
0

我有一個簡單的數組問題與陣列哈希簡單的排序被忽略

 
my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_score:3.5}...] 

我試圖通過優先權分數與

 
sort_array = my_array.sort_by{|priority| priority[:priority_score]} 

奇怪的排序,我沒有得到一回與我原來的數組有什麼不同。

我創建使用

 
new_hash = {id:h.id,priority_score:(a.score+b.score)/2} 

優先權分數和所添加的問題是,優先權分數沒有被識別爲數字的.to_f.to_i萬一種種,但這不是問題。

有什麼建議嗎?

+2

你混淆排序和sort_by - 見http://stackoverflow.com/questions/9104273/9104253/9104425 – 2012-03-03 22:24:28

回答

1

你可以使用這樣的sort_by

my_array.sort_by {|(h, _)| h[:priority_score]} 
# [{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}] 
+0

我以前沒見過'_',那是什麼? (我離開了辦公室,所以直到明天我才能真正檢查它)。 – pedalpete 2012-03-03 23:37:50

+0

'_'意味着不關心價值。 'a,_ = [10,20]'它會將'a'設置爲'10'。 – 2012-03-03 23:41:45

+0

@pedalpete我重新檢查了我的答案,這是錯誤的。 edu的解決方案是正確的。 'my_array.sort_by {| h | h [:priority_score]}'和我的解決方案一樣。你可以刪除接受我會刪除它。 – 2012-03-05 11:09:17

1

Array#sort方法帶有兩個參數a和b的塊,並希望您手動比較它們。考慮到你如何調用它,我想你想要sort_by,它會對數組中的每個項採用一個塊,執行一些轉換,並根據結果進行排序。

+0

感謝Daniel,我輸入錯了,我正在使用'sort_by',現在糾正我的問題。對不起。 – pedalpete 2012-03-03 23:36:16

1

排序得到兩個元素,排序是通過這些元素的比較結果完成的。

這種比較應該等於返回-1,0,1

0,-1第一<秒和1第一>秒。

在大多數的,你可以使用內置的功能紅寶石的情況下< =>

例如:

my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_score:3.5}] 

# Sort ascending 
cr = my_array.sort {|a,b| a[:priority_score] <=> b[:priority_score]} 
#[{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}] 

# Sort descending 
de = my_array.sort {|a,b| b[:priority_score] <=> a[:priority_score]} 
#[{:id=>3, :priority_score=>5}, {:id=>4, :priority_score=>3.5}, {:id=>1, :priority_score=>2}] 
+0

感謝Edu,我輸錯了問題,我正在使用'sort_by'。對於混淆抱歉,但謝謝你這麼清楚地解釋這一點。 – pedalpete 2012-03-03 23:37:17