Porównaj metodę
Zaimplementuj metodę porównawczą dla swojego obiektu:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (lepiej)
lub zwykle nawet lepiej:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Możesz łatwo sortować według wielu kluczy, dodając więcej niż jeden do tablicy. Możliwe jest również użycie niestandardowych metod porównawczych. Zajrzyj do dokumentacji .
Bloki (błyszczące!)
Istnieje również możliwość sortowania według bloku od Mac OS X 10.6 i iOS 4:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Wydajność
-compare:
I metody blokowe oparte będzie trochę szybciej, na ogół, niż przy użyciu NSSortDescriptor
ponieważ te ostatnie opiera się na KVC. Podstawową zaletą tej NSSortDescriptor
metody jest to, że zapewnia ona sposób definiowania kolejności sortowania przy użyciu danych, a nie kodu, co ułatwia np. Konfigurację, aby użytkownicy mogli sortować NSTableView
, klikając wiersz nagłówka.
NSMutableArray
wolę użyć metodsortUsingDescriptors
,sortUsingFunction
lubsortUsingSelector
. O ile tablica jest zmienna, zwykle nie potrzebuję posortowanej kopii.Zobacz
NSMutableArray
metodęsortUsingFunction:context:
Konieczne będzie skonfigurowanie funkcji porównania, która pobiera dwa obiekty (typu
Person
, ponieważ porównujesz dwaPerson
obiekty) i parametr kontekstu .Te dwa obiekty są tylko przypadkami
Person
. Trzeci obiekt to ciąg znaków, np. @ „BirthDate”.Ta funkcja zwraca
NSComparisonResult
: Zwraca,NSOrderedAscending
jeśliPersonA.birthDate
<PersonB.birthDate
. Zwróci,NSOrderedDescending
jeśliPersonA.birthDate
>PersonB.birthDate
. Wreszcie zwróci,NSOrderedSame
jeśliPersonA.birthDate
==PersonB.birthDate
.To jest szorstki pseudokod; musisz wyjaśnić, co to znaczy, że jedna data jest „mniejsza”, „większa” lub „równa” z inną datą (np. porównując sekundy od epoki itp.):
Jeśli chcesz czegoś bardziej kompaktowego, możesz użyć operatorów trójskładnikowych:
Inlining może nieco to przyspieszyć, jeśli często to robisz.
źródło
Zrobiłem to w iOS 4 za pomocą bloku. Musiałem rzutować elementy mojej tablicy z id na typ mojej klasy. W tym przypadku była to klasa o nazwie Wynik z właściwością zwaną punktami.
Musisz także zdecydować, co zrobić, jeśli elementy tablicy nie są odpowiedniego typu, w tym przykładzie właśnie wróciłem
NSOrderedSame
, jednak w moim kodzie pomyślałem o wyjątku.PS: Sortuje w kolejności malejącej.
źródło
downcasting
nie wymaga rzutu przed słabą zmienną.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
Począwszy od iOS 4, możesz także używać bloków do sortowania.
W tym konkretnym przykładzie zakładam, że obiekty w tablicy mają metodę „position”, która zwraca an
NSInteger
.Uwaga: tablica „posortowana” zostanie automatycznie wydana.
źródło
Próbowałem wszystkich, ale to zadziałało dla mnie. W klasie mam inną klasę o nazwie „
crimeScene
” i chcę sortować według właściwości „crimeScene
”.To działa jak urok:
źródło
W drugiej odpowiedzi Georga Schölly'ego brakuje kroku , ale wtedy działa dobrze.
// dodał „s”, ponieważ straciłem czas, gdy kopiowałem i wkleiłem, i nie powiodło się bez „s” w sortedArrayUsingDescriptors
źródło
Dzięki, działa dobrze ...
źródło
Twoje
Person
obiekty muszą zaimplementować metodę, powiedzieć,compare:
który bierze innyPerson
obiekt, i powrócićNSComparisonResult
zgodnie z relacją między dwoma obiektami.Wtedy można by nazwać
sortedArrayUsingSelector:
się@selector(compare:)
i powinno się to odbywać.Istnieją inne sposoby, ale o ile mi wiadomo, nie ma ekwiwalentu kakao
Comparable
interfejsu. UżywaniesortedArrayUsingSelector:
jest prawdopodobnie najbardziej bezbolesnym sposobem na zrobienie tego.źródło
Bloki iOS 4 cię uratują :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html trochę opisu
źródło
Dla
NSMutableArray
użyjsortUsingSelector
metody. Sortuje to miejsce, bez tworzenia nowej instancji.źródło
sortUsingComparator:
.Możesz użyć do tego celu następującej ogólnej metody. To powinno rozwiązać twój problem.
źródło
Jeśli tylko sortujesz tablicę
NSNumbers
, możesz sortować je za pomocą 1 połączenia:Działa to, ponieważ obiekty w tablicy (
NSNumber
obiekty) implementują metodę porównywania. To samo możesz zrobić dlaNSString
obiektów, a nawet dla tablicy niestandardowych obiektów danych, które implementują metodę porównywania.Oto przykładowy kod wykorzystujący bloki komparatora. Sortuje tablicę słowników, w których każdy słownik zawiera liczbę w kluczu „sort_key”.
Powyższy kod przedstawia pracę polegającą na uzyskaniu wartości całkowitej dla każdego klucza sortowania i porównaniu ich, jako ilustracja tego, jak to zrobić. Ponieważ
NSNumber
obiekty implementują metodę porównywania, można ją przepisać znacznie prościej:lub korpus komparatora może być nawet destylowany do 1 linii:
Wolę proste instrukcje i wiele zmiennych tymczasowych, ponieważ kod jest łatwiejszy do odczytania i łatwiejszy do debugowania. Kompilator i tak optymalizuje zmienne tymczasowe, więc nie ma przewagi nad wersją „wszystko w jednym wierszu”.
źródło
Stworzyłem małą bibliotekę metod kategorii, o nazwie Linq do ObjectiveC , która ułatwia takie rzeczy. Za pomocą metody sortowania z selektorem klawiszy możesz sortować
birthDate
w następujący sposób:źródło
Właśnie wykonałem sortowanie wielopoziomowe na podstawie niestandardowych wymagań.
// posortuj wartości
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
źródło
Użyłem sortUsingFunction :: w niektórych moich projektach:
źródło
Używasz NSSortDescriptor do sortowania NSMutableArray z niestandardowymi obiektami
źródło
źródło
Sortowanie
NSMutableArray
jest bardzo proste:źródło
Sortuj za pomocą NSComparator
Jeśli chcemy sortować obiekty niestandardowe, musimy je podać
NSComparator
, które służy do porównywania obiektów niestandardowych. Blok zwracaNSComparisonResult
wartość oznaczającą kolejność dwóch obiektów. Aby więc posortować, cała tablicaNSComparator
jest używana w następujący sposób.Sortowanie za pomocą NSSortDescriptor
Załóżmy na przykład, że mamy tablicę zawierającą instancje klasy niestandardowej, Pracownik ma atrybuty imię, nazwisko i wiek. Poniższy przykład ilustruje sposób tworzenia NSSortDescriptor, którego można użyć do sortowania zawartości tablicy w porządku rosnącym według klucza wieku.
Sortuj za pomocą niestandardowych porównań
Nazwy są ciągami, a podczas sortowania ciągów, które mają być prezentowane użytkownikowi, zawsze należy używać zlokalizowanego porównania. Często chcesz także wykonać porównanie bez rozróżniania wielkości liter. Oto przykład z (localizedStandardCompare :), aby uporządkować tablicę według nazwiska i imienia.
W celu uzyskania informacji i szczegółowej dyskusji zapoznaj się z: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / object-c / how-to-sort-nsarray-with-custom-objects /
źródło
Protokoły Swift i programowanie funkcjonalne sprawiają, że bardzo łatwo jest po prostu dostosować swoją klasę do protokołu porównywalnego, wdrożyć metody wymagane przez protokół, a następnie użyć funkcji sortowania (według:) wysokiego rzędu, aby utworzyć posortowaną tablicę bez konieczności użycia nawiasem mówiąc, zmienne tablice.
źródło
W moim przypadku używam „sortedArrayUsingComparator” do sortowania tablicy. Spójrz na poniższy kod.
Również moim celem jest
źródło
Musisz utworzyć sortDescriptor, a następnie możesz posortować tablicę nsmutablearray za pomocą sortDescriptor jak poniżej.
źródło
Użyj tego dla zagnieżdżonych obiektów,
lastRoute jest jednym obiektem i ten obiekt przechowuje obiekt to, że obiekt zawiera wartości ciągu nazwisk.
źródło
Sortuj tablicę w trybie szybkim
Dla
Swifty
osoby poniżej jest to bardzo czysta technika, aby osiągnąć cel powyżej na całym świecie. Pozwala mieć przykładową klasę niestandardową,User
która ma pewne atrybuty.Teraz mamy tablicę, którą musimy posortować na podstawie
createdDate
rosnącej i / lub malejącej. Dodajmy więc funkcję do porównywania dat.Teraz pozwala mieć
extension
odArray
doUser
. W prostych słowach dodajmy metody tylko dla tych tablic, które zawierają tylkoUser
obiekty.Zastosowanie dla porządku rosnącego
Zastosowanie w porządku malejącym
Wykorzystanie tego samego zamówienia
źródło
Wersja szybka: 5.1
Jeśli masz niestandardową strukturę lub klasę i chcesz je dowolnie posortować, powinieneś wywołać sort () za pomocą zamykania końcowego sortującego według określonego pola. Oto przykład z wykorzystaniem tablicy niestandardowych struktur sortujących według określonej właściwości:
Jeśli chcesz zwrócić posortowaną tablicę zamiast posortować ją w miejscu, użyj sorted () w następujący sposób:
źródło
źródło
źródło