2012-08-15 8 views
3

所以我有一个哈希:{"spider" => 213, "frog" => 128, "apple" => 812}如何通过红宝石中的数值来排序哈希值? (不转换为阵列)

我该如何重新排序,以便按降序对它们进行排序而不将其转换为数组?因此,将其更改为{"apple" => 812, "spider" => 213, "frog" => 128}而不将它变成数组。我试过.sort_by,但是它将它转换为一个数组。

+5

你不能。哈希不保留排序顺序。 – meagar 2012-08-15 18:27:11

+4

他们这样做。 Ruby中的哈希现在是有序结构,从1.9.3开始。 – 2012-08-15 18:37:01

+1

@BorisStitnicky但只有键的顺序。 – 2012-08-15 18:39:09

回答

5

在Ruby 1.9,“Hashes enumerate their values in the order that the corresponding keys were inserted”,所以只要确保你以正确的方式将它们插入:

Hash[h.sort_by { |_, v| -v }] 
#=> > {"apple"=>812, "spider"=>213, "frog"=>128} 
+0

哦,那么Matz以前说过的话是不是真的了?我们是否有散列方法? – 2012-08-15 18:40:09

+2

'sort_by'来自'Enumerable','Hash's包含mixin。这基本上做了散列 - >数组 - >散列,确保按照正确的顺序插入键。 – 2012-08-15 18:42:19

+0

你是对的,有一个!直到它返回一对数组,这就是提问者不想要的东西^ _^ – 2012-08-15 18:42:51

-1

所以,问题不无关系。但为什么?重新排序是什么意思?到位重新排序?不管你做什么,你都必须以某种方式提取散列值。你为什么害怕阵列?你知道小哈希现在在Ruby中作为数组实现吗? (或将要在2.0?)马茨从加入排序方法哈希故意忍住了,我看他对这个话题的帖子...

+0

你究竟如何将非数字键的散列实现为数组?你有没有参考那部分?我可以想像其他方式,比如Lua ...... – 2012-08-15 18:40:57

+0

嗯,我不知道怎么做,但我没有做出来 - 我认真地读了它。 – 2012-08-15 18:45:18

+0

我很想看到关于这个的原始Matz评论。 – 2012-08-15 19:12:53

2

你需要排序的哈希值本身,或者只是其在排序操作的内容订购?如果是后者,那么这个代码段将工作:

myhash.keys.sort.each { |k| .... do something with myhash[k] .... } 

的唯一方法我可以看到,除了简单地填充以排序的顺序来启动与所述散列值,是使用一个中间阵列:

Hash[myhash.sort] 

但是,作为程序员,你不会“看到”中间状态。在散列上使用排序方法将散列转换为有序数组,并且#[]方法将数组强制转换为散列。至少在Ruby-1.9.3上。

+0

唯一的方法是从数组中删除键并使用#merge将它们附加到它。但是从一开始就不需要使用阵列的要求很弱。 – 2012-08-15 21:59:08