Массив объектов: отклонить все, кроме объектов с наибольшим значением

#ruby #arrays

#ruby #массивы

Вопрос:

У меня есть массив закладных объектов

 class Mortgage
  attr_accessor :rate, :deposit

  def initialize(deposit, rate)
    @deposit = deposit
    @rate = rate
  end
end
  

Я хотел бы отклонить любую ипотеку, которая имеет более высокую ставку, чем другая ипотека с тем же депозитом.

Например, представьте следующий массив закладных

 Mortgage 1, :rate => 3, :deposit => 20
Mortgage 2, :rate => 5, :deposit => 20
Mortgage 3, :rate => 7, :deposit => 30
  

Метод должен отклонить закладную 2.

Комментарии:

1. следует ли сохранить исходный порядок или нет?

Ответ №1:

 mortgages = [
  Mortgage.new(20, 3),
  Mortgage.new(20, 5),
  Mortgage.new(30, 7)
]

mortgages.group_by(amp;:deposit).map { |deposit, mortgages| mortgages.min_by(amp;:rate) }
  

group_by создает хэш на основе данного метода, поэтому в этом случае он дает:

 {
  20 => [
          #<Mortgage:0x24 @rate=3 @deposit=20>,
          #<Mortgage:0x2c @rate=5 @deposit=20>
        ],

  30 => [
          #<Mortgage:0x38 @rate=7 @deposit=30>
        ]
}
  

Тогда достаточно просто просто взять ипотеку с минимальной ставкой с каждого депозита.