Вот однопроходное решение.
def f(arr, qty)
h = arr.min_by do |h|
n = h[:minimum_quantity].to_i
n <= qty ? (qty-n) : Float::INFINITY
end
h[:minimum_quantity].to_i <= qty ? h : nil
end
(100..1100).step(100).each { |qty| puts "#{qty}: #{f(arr_of_hsh, qty)}" }
100: nil
200: nil
300: {:minimum_quantity=>"250", :cost=>"1.5600"}
400: {:minimum_quantity=>"250", :cost=>"1.5600"}
500: {:minimum_quantity=>"500", :cost=>"1.3500"}
600: {:minimum_quantity=>"500", :cost=>"1.3500"}
700: {:minimum_quantity=>"500", :cost=>"1.3500"}
800: {:minimum_quantity=>"500", :cost=>"1.3500"}
900: {:minimum_quantity=>"500", :cost=>"1.3500"}
1000: {:minimum_quantity=>"1000", :cost=>"1.1800"}
1100: {:minimum_quantity=>"1000", :cost=>"1.1800"}
Если метод должен вызываться несколько раз для данного arr_of_hsh
, сортируйте arr_of_hsh
по , уменьшая значениеarr_by_hsh[:minimum_quantity.to_i
, а затем просто используйте Enumerable # find .
def f(arr, qty)
h = arr.find { |h| h[:minimum_quantity].to_i <= qty }
end
arr = arr_of_hsh.sort_by { |h| -h[:minimum_quantity].to_i }
#=> [{:minimum_quantity=>"2500", :cost=>"1.0200"},
# {:minimum_quantity=>"1000", :cost=>"1.1800"},
# {:minimum_quantity=>"500", :cost=>"1.3500"},
# {:minimum_quantity=>"250", :cost=>"1.5600"}]
(100..1100).step(100).each { |qty| puts "#{qty}: #{f(arr, qty)}" }
#=> (same as above)