2009-12-21 6 views
20

У меня есть массив объектов NSString, которые я должен сортировать по убыванию.Сортировка массива (NSArray) в порядке убывания

Поскольку я не нашел API для сортировки массива в порядке убывания, я подошел следующим образом.

Я написал категорию для NSString, как указано ниже.

- (NSComparisonResult)CompareDescending:(NSString *)aString 
{ 

    NSComparisonResult returnResult = NSOrderedSame; 

    returnResult = [self compare:aString]; 

    if(NSOrderedAscending == returnResult) 
     returnResult = NSOrderedDescending; 
    else if(NSOrderedDescending == returnResult) 
     returnResult = NSOrderedAscending; 

    return returnResult; 
} 

Тогда я отсортированный массив с помощью оператора

NSArray *sortedArray = [inFileTypes sortedArrayUsingSelector:@selector(CompareDescending:)]; 

Является ли это правильное решение? Есть ли лучшее решение?

ответ

54

Вы можете использовать NSSortDescriptor:

NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO selector:@selector(localizedCompare:)]; 
NSArray* sortedArray = [inFileTypes sortedArrayUsingDescriptors:@[sortDescriptor]]; 

Здесь мы используем localizedCompare: для сравнения строк, и передать NO к возрастанию: возможность сортировки в порядке убывания.

+0

так '' sortDescriptorWithKey 10.6 aboveI использовали следующее заявление. [[NSSortDescriptor alloc] initWithKey: nil по возрастанию: нет]; спасибо ... –

+0

Действительно, я должен был упомянуть об этом - не забывайте -autorelease, хотя :) –

+0

Работает потрясающе! Спасибо! –

4
NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"length" ascending:NO]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[wordsArray sortUsingDescriptors:sortDescriptors]; 

Используя этот код, мы можем отсортировать массив по убыванию в зависимости от длины.

2

или упростить решение:

NSArray *temp = [[NSArray alloc] initWithObjects:@"b", @"c", @"5", @"d", @"85", nil]; 
NSArray *sortedArray = [temp sortedArrayUsingComparator: 
         ^NSComparisonResult(id obj1, id obj2){ 
          //descending order 
          return [obj2 compare:obj1]; 
          //ascending order 
          return [obj1 compare:obj2]; 
         }]; 
NSLog(@"%@", sortedArray); 
Смежные вопросы