Mam tablicę obiektów w Ruby na szynach. Chcę posortować tablicę według atrybutu obiektu. Czy to możliwe?Sortowanie tablicy obiektów w Ruby według atrybutów obiektu?
Odpowiedz
Tak, używając Array#sort!
jest to łatwe.
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Array # sort działa dobrze, jak pisał powyżej:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
ALE, trzeba upewnić się, że operator <=>
jest realizowany dla tego atrybutu. Jeśli jest to rodzimy typ danych Ruby, nie stanowi to problemu. W przeciwnym razie napisz własną implementację, która zwraca -1, jeśli < b, 0, jeśli są równe, i 1, jeśli a> b.
polecam korzystania sort_by zamiast:
objects.sort_by {|obj| obj.attribute}
Zwłaszcza jeśli atrybut może być obliczona.
Lub skrócona wersja: 'objects.sort_by (&: atrybut)' – Nikola
jeszcze bardziej krótszy objects.sort_by &: atrybut –
Jeśli masz problemy z pisownymi dużymi i małymi literami, możesz użyć 'objects.sort_by {| obj | obj.attribute.downcase} ' – campeterson
w przypadku trzeba sortowania przez dwóch atrybutów, gdzie pierwsza jest ważniejsze następnie drugi (środki, przy uwzględnieniu drugiego argumenty tylko jeśli pierwsze argumenty są równe), to może to zrobić jak ten
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
lub w przypadku tablicy tablic
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
Hmmm DZIĘKUJĘ! – MrYoshiji
można wprowadzić dowolny klasa sortable poprzez nadpisanie < => metoda:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(per)
@last_name + @first_name <=> per.last_name + per.first_name
end
end
Teraz tablica obiektów Person będzie sortowalna na last_name.
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
Istnieje wiele identycznych odpowiedzi opublikowanych w 2009 roku. Nie ma potrzeby dodawania kolejnego. – interjay
Nie należy używać sortowania podczas sortowania obiektów, których nie można bezpośrednio porównać. Jeśli musisz uzyskać dostęp do atrybutów lub wykonać obliczenia, aby uzyskać wartość do porównania, użyj "sort_by". Będzie znacznie szybciej. –
porządku rosnącym:
objects_array.sort! { |a, b| a.attribute <=> b.attribute }
lub
objects_array.sort_by{ |obj| obj.attribute }
porządku malejącym:
objects_array.sort! { |a, b| b.attribute <=> a.attribute }
lub
objects_array.sort_by{ |obj| obj.attribute }.reverse
bardziej elegancki objects.sort_by(&:attribute)
można dodać oon w .reverse
jeśli trzeba zmienić kolejność.
- 1. Wyszukiwanie wektora obiektów według atrybutów obiektu
- 2. Sortowanie tablicy obiektów EmberJS posesją
- 3. Sortowanie obiektów w szyku według daty
- 4. Tworzenie tablicy plików i sortowanie według daty w ruby
- 5. Sortowanie obiektów według dwóch właściwości
- 6. Sortowanie wielowymiarowej tablicy według łańcucha?
- 7. dynamicznie dodawanie atrybutów obiektu Ruby
- 8. Sortowanie Java: sortowanie tablicy obiektów według właściwości, obiekt niedozwolony w użyciu Porównywalne
- 9. Sortowanie tablicy obiektów w ActionScript 3
- 10. Sortowanie lista obiektów według właściwości String C#
- 11. Sortowanie listy obiektów według wielu pól
- 12. PHP sortowanie array_intersect_key() wyniki według drugiej tablicy
- 13. Jak sortować słowniki obiektów według wartości atrybutów w pythonie?
- 14. Sortowanie tablicę objective-c obiektów
- 15. Zmienić właściwość obiektu w tablicy obiektów
- 16. Sortowanie obiektu ArrayList według wartości atrybutu w Javie
- 17. sortowanie elementów tablicy struktur
- 18. Sortowanie tablicy NSIndexPaths
- 19. Sortowanie NSArray obiektów niestandardowych według ich właściwości NSDate
- 20. Dodanie obiektu do tablicy obiektów z splice
- 21. Sortowanie obiektów zgodnie z określoną regułą
- 22. SqlAlchemy - Filtrowanie według atrybutów
- 23. Sortowanie w ArrayList według rozmiaru
- 24. Java Sortowanie obiektu w ArrayList
- 25. sortowanie list według grupy
- 26. Sortowanie 10.000 zdjęć według koloru
- 27. sortowanie JSON według daty
- 28. Sortowanie plików według daty
- 29. Sortowanie według indeksu tablicy za pomocą Realm i NSPredicate
- 30. sortowanie listview Sortowanie według określonej kolumny
Thnx kumpel ale mi się nie udało Mam tablicę obiektów. W którym utworzono jeden z atrybutów obiektu. Chcę posortować to za pomocą tego pola. więc zrobiłem @ comm_bytes.sort! {| a, b | a.created_at <=> b.created_at} ale bez powodzenia dla mnie możesz pomóc .... ?? –
Czy istnieje metoda created_at mająca dostęp do atrybutu @created_at? Jakiego rodzaju obiektem jest @created_at? Czy definiuje '<=>'? Jakie błędy dostaniesz? itd., itp., ad nauseum. Innymi słowy, potrzebujemy więcej szczegółów niż "ale bez powodzenia dla mnie". – rampion
działa, jeśli zrobisz myarray = myarray.sort {...} bez "!" – DoruChidean