2013-07-15 64 views
0

我有看起來像這樣的秩序軌的哈希

{"1-5 lbs"=>107342.43999999999, "31+ lbs"=>39838.58000000001, "21-30 lbs"=>19036.41, "11-20 lbs"=>39350.95, "6-10 lbs"=>41401.880000000005}

而且我想,所以它看起來像這樣

{"1-5 lbs"=>107342.43999999999, "6-10 lbs"=>41401.880000000005, "11-20 lbs"=>39350.95, "21-30 lbs"=>19036.41, "31+ lbs"=>39838.58000000001 }

的對它進行排序的散列邏輯被存儲在一個實例變量中@weight_ranges

回答

2

您需要進入正則表達式才能獲取值e的每個 範圍的第一個數字。

Hash[(@weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i})] 

爲了進一步打破它:

# Sort the weight ranges by the first series of digits found in the key 
x = @weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i} 
# Convert each inner Array to a key, value pair in a Hash 
x = Hash[x] 
+0

其實你可以在這裏沒有正則表達式。 – Gene

+0

好點 - 關於'#to_i'工作方式的提示。 – acsmith

1

您所描述的數據作爲哈希值。對於一個序列,你需要一對數組。像這樣的東西會做:

list_of_pairs = @weight_ranges.keys.sort_by(&:to_i).map {|k| [k, @weight_ranges[k]]} 

這利用了一個令人高興的巧合to_i停在第一個非數字它看到。

修正

我剛剛瞭解到,在1.9 Ruby的哈希值進行排序!所以很容易適應:

Hash[@weight_ranges.sort_by{|k,v| k.to_i}] 

我會離開這裏既想法,因爲第一個是正確的仍然爲Ruby < 1.9。

+0

一注 - 第一個例子實際上返回一個數組,而不是一個哈希,我認爲他正在尋找。但是將其封裝在Hash []中解決了這一問題。 – acsmith

+0

@acsmith對。直到有人發佈Ruby哈希現在已經訂購,我才意識到。在1.9之前他們沒有。所以我認爲他需要數組來獲得嚴格的序列。我不確定哪種方法可以創造更少的垃圾。 「merge!」仍然需要一個1鍵哈希來表示它的參數。大概應該嘗試簡單的任務。 – Gene