Подтвердить что ты не робот

Сортировка NSArray из NSString

Может кто-нибудь, пожалуйста, покажет мне код для сортировки NSMutableArray? У меня есть следующий NSMutableArray:

NSMutableArray *arr = [[NSMutableArray alloc] init];

с такими элементами, как "2", "4", "5", "1", "9" и т.д., которые являются все NSString.

Я хотел бы отсортировать список в порядке убывания так, чтобы наибольшее значение целочисленного значения было самым большим в списке (индекс 0).

Я попробовал следующее:

[arr sortUsingSelector:@selector(compare:)];

но он, похоже, не правильно сортировал мои значения.

Может ли кто-нибудь показать мне код для правильного выполнения того, что я пытаюсь выполнить? Спасибо!

4b9b3361

Ответ 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]];
}];