Ruby按哈希值和值排序

时间:2016-11-10 10:34:40

标签: ruby-on-rails ruby sorting hashmap

我有这样的数据:

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类中是否有任何内置函数用于此类目的?

1 个答案:

答案 0 :(得分:10)

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] }