Массив объектов: отклонить все, кроме объектов с наибольшим значением - PullRequest
2 голосов
/ 12 мая 2011

У меня есть массив объектов ипотеки

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 Ответ

5 голосов
/ 12 мая 2011
mortgages = [
  Mortgage.new(20, 3),
  Mortgage.new(20, 5),
  Mortgage.new(30, 7)
]

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...