2016-11-10 190 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