2011-11-08 15 views
18

Potrzebuję wygenerować posortowaną tablicę NSNumber s z innego NSArray. Chcę użyć metody sortedArrayUsingComparator:. Znalazłem ten przykład w dokumentacji Apple:Zmiana kolejności sortowania - [NSArray sortedArrayUsingComparator:]

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 

Tutaj właśnie dostarczam komparatora w bloku, co jest w porządku. Sam rodzaj - ten, który jest ukryty przede mną, który korzysta z tego bloku - wydaje się wznosić.

Chciałabym wiedzieć, czy mogę poprosić o inny porządek zewnętrzny do tego bloku, czy po prostu trzeba odwrócić < i > „s (lub NSOrderedXXX” s) wokół?

Odpowiedz

24

Jeśli chcesz posortować malejąco, po prostu odwróć porównania (lub odwróć NSComparisonResult s). Nie ma potrzeby rozszerzania interfejsu API o parametr ascending:, gdy można go kontrolować bezpośrednio w bloku.

4

Wystarczy zmienić logikę:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 

if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
} 

if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
} 
return (NSComparisonResult)NSOrderedSame; 
}]; 

Dla jasności może być najlepiej zrobić to metoda o nazwie podobnej do: decendingSort.

+1

Oczywiście to jest w porządku, ale jeśli nie ozdobić go z pomarańczy - komentarze na temat stożka-stożka napisane czerwonym tuszem z napisem "Jezus Chrystus", stwierdzające, że odwróciłeś zamówienie, w pewnym momencie może to być potencjalny koszmar związany z debugowaniem. Budowanie deskryptora sortowania będzie miało więcej sensu i będzie samo komentowaniem, chyba że wystąpienie będzie miało poważne skutki. –

+0

@God Deskryptor sortowania brzmi świetnie, proszę podać przykład implementacji dla porównania. – zaph

4

Z dokumentacji -sortedArrayUsingComparator::

„Zwraca tablicę z listą elementów tablicy odbiorczego w porządku rosnącym, jak określono metodą porównania określonego przez dany NSComparator Block.”

Więc Trzeba uciekać się do korzystania

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

ale oczywiście, że środki toczące swoją NSSortDescriptor obiektów pierwszy, który może spełnić Twoje cele dobrze.

+0

+1 za wskazanie, że jest to faktycznie udokumentowane. Pozdrawiam Jeffa. –

4

Możesz odwrócić operatorów.

"Bit, który jest ukryty przed tobą" nie obchodzi wznoszenie się lub zstępowanie, ponieważ nie wie nic o twoich obiektach. To tak, jakby zapytać współpracownika, czy krążek hokejowy jest większy czy mniejszy niż piżmak. Wewnętrzna implementacja po prostu używa algorytmu sortowania (który jest prawdopodobnie określony przy użyciu rozmiaru twojej tablicy) i wykorzystuje twoją funkcję blokową do porównywania dwóch obiektów.

Powiązane problemy