Сортировка NSArray, многие из которых содержат число

У меня есть NSArray, который заполняется объектами из NSMuttableArray. Большинство из этих объектов имеют целочисленные значения, такие как "1", "2", "3", "4", "5", иногда есть такое имя, как "home", "far left" или "far right". Я пытаюсь сортировать этот массив в Objective C., используя sortedArrayUsingSelector: @selector (compare:) отлично работает, когда у меня меньше 10 элементов массива. но когда этого больше, я начинаю получать вещи типа "1", "10", "11", "12", "2", "3". Любая помощь будет оценена по достоинству. Код не должен возвращать ничего. Это просто нужно сортировать и двигаться дальше.

Оригинальный код:

presetNamesSort = [[[NSMutableArray alloc]init]retain];

presetNamesSort = [presetNames sortedArrayUsingSelector:@selector(compare:)];

Ответ 1

Вы можете использовать метод NSArray -sortedArrayUsingComparator: для получения отсортированного массива с использованием настраиваемого блока. Я считаю это более удобным, чем -sortedArrayUsingSelector:, потому что вы можете объявить компаратор встроенным, например:

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];

Это вернет массив, который выглядит так:

(
    1,
    2,
    4,
    5,
    10,
    Hello,
    Hi
)

В общем, довольно неплохо использовать блоки, потому что они устраняют необходимость создания случайных селекторов, которые запускают amuk в вашем коде.

Ответ 2

попробуйте использовать -[NSString compare:options:] с помощью NSNumericSearch. Чтобы использовать это с помощью -sortedArrayUsingSelector:, вы должны обернуть вызов сравнения в отдельный метод категории на NSString:

- (NSComparisonResult)numericCompare:(NSString *)aString {
    return [self compare:aString options:NSNumericSearch];
}

Ответ 3

Для сортировки Descending

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];
sortedArray = [[sortedArray reverseObjectEnumerator] allObjects];`

И для отправки

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];