2010-08-04 48 views
4

是否可以在散列中进行条件排序?是否有可能在散列中进行条件排序?

我的哈希如:

{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

苏尔e,你可以这样做:

>> {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]对的数组,然后按照从< =>返回的-1,0,1进行排序。

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

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

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

您可以更改的条件,以满足您的需求。

但要小心,在红宝石1.8中,散列不是按键排序的。如果您转换回散列,则不保证订单。

相关问题