是否可以在哈希中进行条件排序?

时间:2010-08-04 07:14:39

标签: ruby-on-rails hash sorting

是否可以在哈希中进行条件排序?

我的哈希就像:

{1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60",7=>"70",8=>"80",9=>"90"}

期望的结果是:

{7=>"70",8=>"80",9=>"90",1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60"}

在此代码中添加条件

operation_hour_hash.sort{|key,value| key[1]<=>value[1]}

3 个答案:

答案 0 :(得分:3)

当然,你可以这样做:

>> {1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60",7=>"70",8=>"80",9=>"90"}.sort{|p,n| (p[1].to_i>=70 && n[1].to_i<70) ? -1 : (p[1].to_i<70 && n[1].to_i>=70) ? 1 : p[1].to_i <=> n[1].to_i}

=> [[7, "70"], [8, "80"], [9, "90"], [1, "10"], [2, "20"], [3, "30"], [4, "40"], [5, "50"], [6, "60"]]

但是,排序哈希并没有多大意义。在排序实际发生之前,它被转换为[key,value]对的数组,然后从&lt; =&gt;返回的-1,0,1进行排序。

如果你需要排序哈希,你需要使用类似RubyFacets Dictionary类的东西。

答案 1 :(得分:1)

您的排序电话具有误导性。您没有比较键和值,您正在比较数组的两个不同元素。所以它应该是:

operation_hour_hash.sort{|a,b| a[1]<=>b[1]}

您可以在排序块中实现所需的任何逻辑,只要它遵循以下内容:

  

该块实现了比较   在a和b之间,返回-1,0或   1

(取自:http://ruby-doc.org/core/classes/Array.html#M002185

答案 2 :(得分:1)

您可以尝试这样的方法来生成排序数组

operation_hour_hash.sort {|x,y| (x[0]>6?x[0]-6:x[0]+24)<=>(y[0]>6?y[0]-6:y[0]+24)}
>>  [[7, "70"], [8, "80"], [9, "90"], [1, "10"], [2, "20"], [3, "30"], [4, "40"], [5, "50"], [6, "60"]]

您可以根据自己的需要更改条件。

但是请注意,在ruby 1.8中,密钥不会对哈希进行排序。如果您转换回哈希值,则无法保证订单。