获得哈希

问题描述:

我有这样的哈希值的数组,这是由价值: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}] 

对我来说似乎是公认的答案,使假设数组中的第一个元素的: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

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