Получить хеш, который соответствует минимальному количеству - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть массив хэшей:

arr_of_hsh =[
  {minimum_quantity: "250", cost: "1.5600"},
  {minimum_quantity: "500", cost: "1.3500"},
  {minimum_quantity: "1000", cost: "1.1800"},
  {minimum_quantity: "2500", cost: "1.0200"}
]

Учитывая определенную сумму, я хотел бы получить хэш, значение которого для :minimum_quantity является ближайшим к сумме среди тех, кто меньше или равенна сумму.Например, если сумма была 300, этот хеш будет возвращен:

{minimum_quantity: "250", cost: "1.5600"}

, а если сумма была 1000:

{minimum_quantity: "1000", cost: "1.1800"}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот однопроходное решение.

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)
0 голосов
/ 07 декабря 2018

Сохраняя вашу структуру данных такой же, я бы сказал так

 arr_of_hsh.select { |item| item[:minimum_quantity].to_i <= quantity }.
   max_by { |item| item[:minimum_quantity].to_i }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...