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

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个回答

3
当然,你可以像这样做:
```html

当然,你可以像这样做:

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

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

但是请注意,在 Ruby 1.8 中,哈希表不会按键排序。如果您转换回哈希表,则无法保证顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接