Сортировать объекты по логическим значениям в Ruby
-
05-09-2019 - |
Вопрос
Мои извинения, если на это было дано ответ раньше или очевидно ... сделал некоторый поиск здесь и на GOOG и не смог найти ответ.
Я хочу сортировать массив поставщиков по цене и является ли они предпочтительным (правда или ложь)
Например в array p of Providers
...
p1.price == 1, p1.preferred_provider? == false
p2.price == 2, p2.preferred_provider? == true
p2.price == 3, p3.preferred_provider? == true
Я хотел бы получить p.sort_by и получить:
[p2 p3 p1]
IAW
p.sort_by {|x| x.preferred_provider?, x.price }
не работает и получает ...
undefined method `<=>' for false:FalseClass
Какие -нибудь предложения по лучшим способам решения этой проблемы?
Решение
Большинство языков предоставляют функции сортировки, которые принимают компараторы для такого рода вещей. В Ruby это просто Array.sort:
p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
then a.price <=> b.price
elsif a.preferred_provider?
1
else -1
}
Другие советы
Вы можете определить <=>
на Provider
класс, чтобы делать то, что вы хотите, а затем сортируйте, используя Array.sort
Метод (а не Enumerable.sort_by
) Вот определение <=>
что я взбил:
class Provider
def <=>(other)
if preferred_provider?
if other.preferred_provider?
@price <=> other.price
else
1
end
else
if other.preferred_provider?
-1
else
@price <=> other.price
end
end
end
end
Тогда, если у вас есть ваш массив p
, ты мог бы просто сделать p_sorted = p.sort
.
(Обратите внимание, что я не проверил этот код, поэтому может быть несколько ошибок, но я думаю, что он служит для демонстрации этой идеи.)