2012-04-19 51 views
3

我有這樣一個哈希:使用鍵的值進行排序的哈希

a = { 29 => 3, 14 => 6, 13 => 2, 32 => 10 } 

我要作爲排序依據的值出現,即該散列:3,6,2,10

我能做a.values.sort

但它返回一個只是排序值的數組。我想對實際的散列進行排序,所以它應該返回一個新的散列(或理想情況下用已排序的散列來更新原始散列),並且使用所有相同的鍵值對進行排序!

回答

5

這部作品的Ruby 1.9:

a = { 29 => 3, 14 => 6, 13 => 2, 32 => 10 } 
p Hash[a.sort_by{|k,v| v}] 
#=> {13=>2, 29=>3, 14=>6, 32=>10} 
+2

很酷,但他希望它按值排序:'Hash [a.invert.sort] .invert' – 2012-04-19 20:53:06

+0

@Abe Voelker你是對的。嗯,invert.invert?勒梅認爲.. – steenslag 2012-04-19 20:55:52

+0

是Abe Voelker ..這將是答案! a.invert將鍵值交給值鍵,然後對它們進行排序,然後將它們切換回去!真棒:D – bytebiscuit 2012-04-19 20:57:02

2

在紅寶石(預1.9)A散列是無序。您不能'使用相同的鍵值對進行排序返回新的哈希',因爲哈希實現並不會對條目進行排序。你有兩個選擇:

  1. 請使用ActiveSupport :: OrderedHash的實例(從active_support寶石)
  2. 使用排序對數組的形式來執行需要分類輸入的任何行動。通過將該數組傳遞給哈希構造函數(Hash.new或Hash [])來轉換回哈希