2012-03-03 25 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