Próbuję posortować tablicę obiektów na podstawie różnych atrybutów. Niektóre z tych atrybutów chciałbym posortować w porządku rosnącym, a niektóre w porządku malejącym. Mogłem sortować rosnąco lub zstępując, ale nie udało mi się połączyć tych dwóch elementów.Sortowanie wielu wartości według rosnącej i malejącej wartości
Oto proste klasy pracuję z:
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
mogę wtedy instancji niektóre psy mają być sortowane później.
@rover = Dog.new("Rover", "Male")
@max = Dog.new("Max", "Male")
@fluffy = Dog.new("Fluffy", "Female")
@cocoa = Dog.new("Cocoa", "Female")
Mogę następnie użyć metody sort_all_by_gender_then_name.
Dog.sort_all_by_gender_then_name
=> [@cocoa, @fluffy, @max, @rover]
Tablica, którą zwraca, obejmuje najpierw kobiety, a następnie mężczyzn, wszystkie posortowane według nazwy w kolejności rosnącej.
Ale co, jeśli chcę, aby płeć zstępowała, a następnie nazwa rosnąco, tak aby najpierw były to mężczyźni, a następnie posortowane według nazwy rosnąco. W tym przypadku:
=> [@max, @rover, @cocoa, @fluffy]
Albo gdybym chciał go przez rosnącym płci, ale nazwa malejąco:
=> [@fluffy, @cocoa, @rover, @max]
Przy sortowaniu wartości liczbowe można poprzedzić a - zrobić to w odwrotnej kolejności sortowania. Jednak nie byłem w stanie znaleźć sposób, aby to zrobić z ciągów. Każda pomoc lub pomysły będą mile widziane. Dzięki.
Mam wątpliwości, że nadal nie rozumiem o 'enum # sort' is - jak' <=> 'wyniki pomagają enum się posortować? w jaki sposób 3 wartości "-1,0, + 1" pomagają w wyliczaniu enum? –
@Priti, jest podobny do funkcji sortowania języka (C, C++) - jeśli chcesz, aby pierwszy parametr był oceniany przed drugim, zwróć +1, jeśli chcesz, aby pojawiały się w tej samej kolejności, w jakiej były listę, a następnie 0, w przeciwnym razie drugi parametr ma być przed, return -1. – Dogbert
@Priti, daj mi znać, jeśli źle zrozumiałem twoje wątpliwości. – Dogbert