2011-11-08 81 views
0

所以基本上我有一個充滿整數這樣的哈希 - >最快的方式

{5=>1, 3=>2, 2=>3, 1=>4, 4=>5} 

你會發現,值是散列中第一個數字的位置。

後我排序基於密鑰的哈希,它看起來像這樣 - >

{1=>4, 2=>3, 3=>2, 4=>5, 5=>1} 

我想要做的就是從原來的哈希刪除第一個元素,其值越低,則前一個。

如此明顯的方法可以讓我覺得這樣做是:

lastvalue = -1 
sortedNumbers.each{ |key,value| 
    if value < lastvalue 
     original_array.delete(key) 
     return "deleted element" 
    end 

    last_value = value 
} 

這是在正確/速度方面要做到這一點的最好方法是什麼?這通常是解決問題的中等程度的好方法嗎?

lastvalue = -1 
original_array.clone.each{ |key,value| 
    original_array.delete(key); return "deleted element" if value < last_value 
    last_value = value 
} 

Basicly相同的東西,但有點聰明代碼:

+0

我知道散列有某種1.9訂貨的,但它依靠的是排序,而不是使用數組是個好主意? (我沒有意思是諷刺 - 我真的不確定) –

+2

哈希值保證在1.9中保持他們的插入順序。無論如何,從一個切換到另一個很容易。 –

回答

2

比較可枚舉的連續值,使用#each_cons

key = sortedNumbers.each_cons(2) do |(k1, v1), (k2, v2)| 
    break k2 if v2 < v1 
end 
sortNumbers.delete(key) 
+0

這會比@davidb和我的答案更快嗎? – Evan

+0

不確定,可能會更慢。我只是喜歡它,這是更一般的,沒有假設鍵是(非負)整數等... –

+0

我會擔心在迭代過程中修改散列。 – Phrogz