2011-09-20 11 views
11

Mam tablicę obiektów i trzeba ją posortować według oceny i po niej według liczby głosów potomnych (tak, że jeśli dwa 5-gwiazdkowe oceniane elementy będą porównywane, pierwszy z największą liczbą głosów powinien być pierwszy)ustawianie wielu deskryptorów sortowania

Czy można sortować NSArray według dwóch deskryptorów: najpierw po ocenie, a potem po liczeniu głosów?

Znalazłem na http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

coś podobnego sortUsingDescriptors: ale nie mogę go nigdzie znaleźć w docs, że to jest przestarzała.

Odpowiedz

29

Tak można:

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortVotes = [[NSSortDescriptor alloc] initWithKey:@"votes" ascending:NO]; 

NSArray *sortedArray = [orignalAray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating, sortVotes, nil]]; 
[sortRating release], sortRating = nil; 
[sortVotes release], sortVotes = nil; 
1

Masz zasadniczo rację. Na NSArray znajduje się metoda. To zwróci nową tablicę, posortowaną według różnych deskryptorów.

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

istnieje, ale jest na NSMutableArray, co może wyjaśniać, dlaczego nie można go znaleźć w dokumentacji NSArray. Osiąga ten sam cel, ale sortuje tablicę, do której go wywołujesz, zamiast zwracać nową tablicę. Ani nie jest przestarzałe.

0

Zastosowanie - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors. Oto dokumentacja: NSArrayClass Reference

np:

NSSortDescriptor *sortRating = nil; 
NSSortDescriptor *sortDate = nil; 

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
NSArray *sortedArray = [auxArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating,sortDate,nil]]; 

[sortRating release]; 
sortRating = nil; 

[sortDate release]; 
sortDate = nil; 

Cheers!

+0

Twój kod nie będzie kompilować i przeciekają sortRating i sortDate – rckoenes

+0

nadal nie będzie skompilować. Przyczyna, dla której nie zostanie skompilowana, jest taka, że ​​jesteś redefiniowany w nazwach zmiennych "sortRating" i "sortDate". Zwolniłeś również obiekt o nazwie 'sortDescriptor', który nie jest zdefiniowany i nie zwalniasz' sortRating' i 'sortDate'. – rckoenes

1

Oto jeden liniowiec.

NSArray *sortedArray = [unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor [email protected]"rating" ascending:NO], [NSSortDescriptor [email protected]"date" ascending:NO], nil]]; 
0

Jeśli masz jeden NSArray korzystać z tego jeden:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"x_date" ascending:TRUE]; 
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"x_time" ascending:TRUE]; 
[tempArray sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,sortDescriptor1, nil]]; 
Powiązane problemy