2009-09-16 9 views

Odpowiedz

19

użycie sort_by

array.sort_by{|e| e.something}

lub

sort_lambda = lambda{|e| e.something} 
array.sort_by(&sort_lambda) 

W ostatni można ponownie wykorzystać sort_lambda w innych sprawozdaniach sort_by

5

W Rails, lub raczej z ActiveSupport lub w Ruby 1.9 (być może 1.8.7, nie jestem pewien) możesz użyć nowego skrótu:

array.sort_by(&:something) 

Należy pamiętać, że ma potencjalnie kosztowne (i być może korzystne: zależy od złożoności klucza sortowania) skutki uboczne: generuje i przechowuje tymczasową parę klucz-wartość dla każdej pozycji, dzięki czemu może sortować według nowego klucza. Zobacz discussion in the documentation, aby uzyskać więcej informacji na ten temat.

+0

Tak, Ruby 1.8.7 ma Symbol # to_proc. – Chuck

+0

Byłoby miło, gdyby array.sort_on (: coś) działało również. – tadman

+0

Jest to banalne do zaimplementowania: 'def sort_on (property) sort_by & property end' – Chuck

5

+1 zarówno sugestii Eimantas', ale często to wymyślić w przypadkach gdzie mam klasy niestandardowego zawsze rodzaju w ten sposób, jak Albums że powinien posortować rozróżniana wielkość liter, ignorując znaki interpunkcyjne i tym prowadzącej/a/an. W tym celu bardziej wydajne jest obliczenie wartości sortowania, a następnie ponowne zdefiniowanie < =>. Np .:

class Album 
def sort_value 
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"") 
    end 

    def <=>(other) 
    sort_value <=> (other.sort_value rescue other) 
    end 
end 
0

Czy wziąłeś pod uwagę Porównywalne w klasie dla aib, i po prostu nazywając sortowanie?