2016-11-10 187 views
0

我的數據是這樣的:紅寶石排序哈希和價值

hash_data = [ 
    {:key1 => 'value4', :sortby => 4}, 
    {:key1 => 'valuesds6', :sortby => 6}, 
    {:key1 => 'valuedsd', :sortby => 1}, 
    {:key1 => 'value2_data_is_here', :sortby => 2} 
] 

我想關鍵sortby

hash_data = [ 
    {:key1 => 'valuedsd', :sortby => 1}, 
    {:key1 => 'value2_data_is_here', :sortby => 2}, 
    {:key1 => 'value4', :sortby => 4}, 
    {:key1 => 'valuesds6', :sortby => 6} 
] 

我一直在使用冒泡排序試圖把它整理到這一點,但有Hash類中的任何內置函數用於這種目的?

回答

9

Enumerable#sort_by救援:

hash_data.sort_by { |hash| hash[:sortby] } 
#=> [{:key1=>"valuedsd", :sortby=>1}, {:key1=>"value2_data_is_here", :sortby=>2}, {:key1=>"value4", :sortby=>4}, {:key1=>"valuesds6", :sortby=>6}] 

如果你不關心初始對象,我會建議使用Array#sort_by!修改就地 - 這是資源效率更高:

hash_data.sort_by! { |hash| hash[:sortby] } 

如果你有不同類型的數據作爲sortby鍵的值,你應該首先統一數據類型,然後才能執行排序。

要使陣列以降序排列,使用Enumerable#reverse(或reverse!):

hash_data.sort_by {|hash| hash[:sortby] }.reverse 
#=> [{:key1=>"valuesds6", :sortby=>6}, {:key1=>"value4", :sortby=>4}, {:key1=>"value2_data_is_here", :sortby=>2}, {:key1=>"valuedsd", :sortby=>1}] 

按降序排序另一種選擇是下面的 - 注意減號(學分@ sagarpandya82):

hash_data.sort_by {|hash| -hash[:sortby] } 
+0

給我這個錯誤:「Float與-0.6失敗比較」 – user1735921

+2

@ user1735921與您的輸入數據的工作原理。如果你有更具體的問題 - 用真實的數據來編輯你的問題,因爲在問一個問題,得到一個完全有效的答案,然後說「嘿,我的真正的數據是完全不同於OP它是沒有意義的工作:) :) –

+0

嘿其排序的數據,但其排序的升序,我想在降序 – user1735921