是否可以在哈希中进行条件排序?
我的哈希就像:
{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]}
答案 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
答案 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中,密钥不会对哈希进行排序。如果您转换回哈希值,则无法保证订单。