Я пытаюсь сортировать массив объектов на основе разных атрибутов. Некоторые из этих атрибутов я хотел бы сортировать в порядке возрастания, а некоторые - в порядке убывания. Я смог сортировать по восходящей или нисходящей, но не смог совместить эти два.Сортировка нескольких значений по возрастанию и убыванию
Вот простой класс я работаю с:
class Dog
attr_reader :name, :gender
DOGS = []
def initialize(name, gender)
@name = name
@gender = gender
DOGS << self
end
def self.all
DOGS
end
def self.sort_all_by_gender_then_name
self.all.sort_by { |d| [d.gender, d.name] }
end
end
Затем я могу создать экземпляр некоторые собаки должны быть отсортированы позже.
@rover = Dog.new("Rover", "Male")
@max = Dog.new("Max", "Male")
@fluffy = Dog.new("Fluffy", "Female")
@cocoa = Dog.new("Cocoa", "Female")
Затем я могу использовать метод sort_all_by_gender_then_name.
Dog.sort_all_by_gender_then_name
=> [@cocoa, @fluffy, @max, @rover]
В массив, который он возвращает, входят женщины сначала, а затем самцы, отсортированные по имени в порядке возрастания.
Но что, если я хочу, чтобы гендер спустился, а затем назовите восхождение, чтобы он был первым, а затем отсортирован по имени по возрастанию. В этом случае:
=> [@max, @rover, @cocoa, @fluffy]
Или, если бы я хотел его по полу по возрастанию, но название по убыванию:
=> [@fluffy, @cocoa, @rover, @max]
При сортировке числовых значений, вы можете предварять - сделать его сортировку в обратном направлении. Однако я не смог найти способ сделать это со строками. Любая помощь или идеи будут оценены. Благодарю.
У меня есть сомнения, что я до сих пор не понимаю о 'enum # sort' is - how' <=> 'Результаты помогают перечислению для сортировки? как 3 значения '-1,0, + 1' помогают в перечислении для сортировки? –
@Priti, это похоже на то, что имеет функция сортировки большинства языков (C, C++) - если вы хотите, чтобы первый параметр был ранжирован до второго, верните +1, если вы хотите, чтобы они отображались в том же порядке, в каком они были в список, то 0, в противном случае вы хотите, чтобы второй параметр был раньше, return -1. – Dogbert
@Priti, дайте мне знать, если я неправильно понял ваши сомнения. – Dogbert