忽略数组中哈希的简单排序问题

时间:2012-03-03 22:16:15

标签: ruby arrays sorting hash

我有一个简单的数组

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,以防问题是优先级分数未被识别为数字,但这不是问题。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

Array#sort方法采用带有两个参数a和b的块,并希望您手动比较它们。鉴于你如何调用它,我想你想要sort_by,它对数组中的每个项进行一个块,执行一些转换,然后按结果排序。

答案 1 :(得分: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}]

答案 2 :(得分:1)

sort有两个元素,排序由这些元素的比较结果完成。

此比较应返回-1,0,1。

0表示相等,-1表示第一个<第二个和+1第一个>第二

在大多数情况下,您可以使用内置函数的ruby< =>

例如:

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