2012-09-17 39 views
0

我有這樣的哈希值的數組,這是由價值:a分類的一個子:獲得哈希

[{:a=>0, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 

我怎樣才能得到這個數組與最小值的散列的一個子集爲:a? 這裏,:a最小值爲0,所以我需要:

[{:a=>0, :b=>10}, {:a=>0, :b=>35}] 

回答

1

對我來說似乎是公認的答案,使假設數組中的第一個元素的:a值最小。所以如果數組在第一個元素:a => 1處被修改,那麼結果是不正確的。這裏的例子:

# original 
z = [{:a=>0, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 
puts z.select{|y| y[:a] == z.first[:a]}.inspect 
# => [{:a=>0, :b=>10}, {:a=>0, :b=>35}] the result is the expected one 

# modified :a of first element 
z = [{:a=>1, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 
puts z.select{|y| y[:a] == z.first[:a]}.inspect 
# => [{:a=>1, :b=>10}, {:a=>1, :b=>20}] here result does not have min :a 

現在不做這種假設我正在尋找的:a

z = [{:a=>0, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 
# find the min :a 
m = z.map { |y| y[:a] }.min 
puts z.select{|y| y[:a] == m}.inspect 
# => [{:a=>0, :b=>10}, {:a=>0, :b=>35}] 

# modified :a of first element 
z = [{:a=>1, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 
m = z.map { |y| y[:a] }.min 
puts z.select{|y| y[:a] == m}.inspect 
# => [{:a=>0, :b=>35}] 
+0

馬克嗨,我 最小值的額外步驟甚至沒有注意到我遇到的麻煩之前,非常感謝! – ctp

+0

其實這個問題本身提到「我有這樣一個哈希數組,這是排序的價值爲:a」,這是我從哪裏得到的假設:) –

+0

你是完全正確的。我應該仔細閱讀。 – Marc

3
z = [{:a=>0, :b=>10}, {:a=>0, :b=>35}, {:a=>1, :b=>20}, {:a=>2, :b=>0}] 
z.select{|y| y[:a] == z.first[:a]} 
+0

酷,許多THX ... – ctp