2008-12-12 120 views
4

我有这样如何排序不是简单的散列(哈希散列)

{ 55 => {:value=>61, :rating=>-147}, 
    89 => {:value=>72, :rating=>-175}, 
    78 => {:value=>64, :rating=>-155}, 
    84 => {:value=>90, :rating=>-220}, 
    95 => {:value=>39, :rating=>-92}, 
    46 => {:value=>97, :rating=>-237}, 
    52 => {:value=>73, :rating=>-177}, 
    64 => {:value=>69, :rating=>-167}, 
    86 => {:value=>68, :rating=>-165}, 
    53 => {:value=>20, :rating=>-45} 
} 

我如何通过排序呢散列:评分?或者,也许我应该使用一些不同的结构?

+1

也许值得一提的称号的编程语言。 – danieltalsky 2008-12-12 07:46:34

回答

5

我的数据结构改变为散列的数组:

my_array = 
[ 
    {:id => 78, :value=>64, :rating=>-155}, 
    {:id => 84, :value=>90, :rating=>-220}, 
    {:id => 95, :value=>39, :rating=>-92} 
] 

您可以轻松地

my_array.sort_by { |record| record[:rating] } 

排序这种结构要获得通过id获取记录的类似哈希的功能,您可以在my_array上定义新方法:

def my_array.find_by_id(id) 
    self.find { |hash| hash[:id] == id } 
end 

打完,你可以做的

my_array.find_by_id(id) 

代替

my_hash[id] 
+0

不知道此评论是否会在4年后回答....我使用哈希的原因是使用一个可以直接访问并增加值,例如h [436246]。在我填充散列之后,我应该将其转换为数组 – nilanjan 2013-01-04 14:39:33

5

哈希值在Ruby中不能进行排序(至少不是1.9之前)

这意味着通过散列循环并不一定会产生信息以正确的顺序为您服务。然而,这是微不足道的遍历一个特定的顺序散列数据,首先将其转换为一个数组,而实际上调用一个Hash排序方法将其转换成一个Array,您:

>> { :a => 4, :b => 12, :c => 3, :d => 8 }.sort_by { |key, value| value } 
=> [[:c, 3], [:a, 4], [:d, 8], [:b, 12]] 

因此,在您案例:

hsh.sort_by {|key, ratings| ratings[:rating] } 
+0

@Gaius - 感谢编辑,但代码的工作原理如下。我的观点是,#sort_by隐式地进行了数组转换,而不需要粘贴.to_a - 即使在Ruby 1.8中也是如此 – Gareth 2008-12-13 09:55:47

3

有可能是一个更好的数据结构,但(我假设这是红宝石),因此可以在Ruby中做使用内嵌式的排序基本上告诉它如何比较两个。这里有一个具体的例子:

my_hash = { 
    55 => {:value=>61, :rating=>-147}, 
    89 => {:value=>72, :rating=>-175}, 
    78 => {:value=>64, :rating=>-155}, 
    84 => {:value=>90, :rating=>-220}, 
    95 => {:value=>39, :rating=>-92}, 
    46 => {:value=>97, :rating=>-237}, 
    52 => {:value=>73, :rating=>-177}, 
    64 => {:value=>69, :rating=>-167}, 
    86 => {:value=>68, :rating=>-165}, 
    53 => {:value=>20, :rating=>-45} 
} 

puts "MY HASH" 
my_hash.each do |local| 
    puts local 
end 

sorted_hash = my_hash.sort { | leftval, rightval | rightval[1][:rating]<=>leftval[1][:rating] } 

puts "SORTED HASH" 
sorted_hash.each do |local| 
    puts local 
end 
+0

这里没有多大区别,但#sort通常对计算字段效率不高。这是因为它会重新计算* every *比较的排序标准。 #sort_by仅针对原始数组中的每个项目计算标准一次 – Gareth 2008-12-12 07:56:35