Сортировка NSArray из NSString
Может кто-нибудь, пожалуйста, покажет мне код для сортировки NSMutableArray? У меня есть следующий NSMutableArray:
NSMutableArray *arr = [[NSMutableArray alloc] init];
с такими элементами, как "2", "4", "5", "1", "9" и т.д., которые являются все NSString.
Я хотел бы отсортировать список в порядке убывания так, чтобы наибольшее значение целочисленного значения было самым большим в списке (индекс 0).
Я попробовал следующее:
[arr sortUsingSelector:@selector(compare:)];
но он, похоже, не правильно сортировал мои значения.
Может ли кто-нибудь показать мне код для правильного выполнения того, что я пытаюсь выполнить? Спасибо!
Ответы
Ответ 1
Очень просто написать собственный метод сравнения для строк:
@implementation NSString(compare)
-(NSComparisonResult)compareNumberStrings:(NSString *)str {
NSNumber * me = [NSNumber numberWithInt:[self intValue]];
NSNumber * you = [NSNumber numberWithInt:[str intValue]];
return [you compare:me];
}
@end
Ответ 2
Вы должны использовать этот метод:
[arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
в NSArray
или:
[arr sortUsingSelector:@selector(caseInsensitiveCompare:)];
в сортировке "inplace" NSMutableArray
Компаратор должен вернуть одно из следующих значений:
-
NSOrderedAscending
-
NSOrderedDescending
-
NSOrderedSame
Ответ 3
Если элементы массива - это просто NSStrings с цифрами и без букв (например, "8", "25", "3" и т.д.), здесь работает чистый и короткий путь, который действительно работает:
NSArray *sortedArray = [unorderedArray sortedArrayUsingComparator:^(id a, id b) {
return [a compare:b options:NSNumericSearch];
}];
Готово! Не нужно писать целый метод, который возвращает NSComparisonResult
, или восемь строк NSSortDescriptor
...
Ответ 4
IMHO, самый простой способ сортировки такого массива -
[arr sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self.intValue" ascending:YES]]]
Если ваш массив содержит значения с плавающей запятой, просто измените ключ на self.floatValue
или self.doubleValue
Ответ 5
Самый простой способ - сделать метод компаратора, подобный этому
NSArray *sortedStrings = [stringsArray sortedArrayUsingComparator:^NSComparisonResult(NSString *firstString, NSString *secondString) {
return [[firstString lowercaseString] compare:[secondString lowercaseString]];
}];