Как сделать естественный вид на NSArray?

У меня есть массив объектов, и мне нужны они отсортированный по их ключу "заголовка". Это в настоящее время работает, хотя это использует вид ASCII вместо естественного вида. Заголовки являются именами файлов, таким образом, они похожи на это:

file1
file2
file3
...
file10
file11
file12

Я добираюсь, как Вы ожидали бы:

file1
file10
file11
file12
file2
file3
...

Кто-либо знает, существует ли путь, встроенный к NSArray сортировка функциональности для получения этой естественной сортировки в противоположность алфавитному виду? Я нашел некоторые универсальные алгоритмы, но я надеялся на что-то встроенное...

36
задан Cory Imdieke 17 May 2010 в 02:12
поделиться

2 ответа

NSString s можно сравнить с помощью NSNumericSearch сравнить вариант.

Одна версия:

NSInteger sort(Obj* a, Obj* b, void*) {
    return [[a title] compare:[b title] options:NSNumericSearch];
}

result = [array sortedArrayUsingFunction:&sort context:nil];

Или немного более общая:

NSInteger sort(id a, id b, void* p) {
    return [[a valueForKey:(NSString*)p] 
            compare:[b valueForKey:(NSString*)p]
            options:NSNumericSearch];
}

result = [array sortedArrayUsingFunction:&sort context:@"title"]

Или с использованием блоков:

result = [array sortedArrayUsingComparator:^(Obj* a, Obj* b) { 
    return [[a title] compare:[b title] options:NSNumericSearch]; 
}];
53
ответ дан 27 November 2019 в 05:36
поделиться

Те, кто пытается воспроизвести поведение сортировки Finder в Mac OS X 10.6 и новее и iOS 4 и новее, могут использовать localizedStandardCompare: в качестве селектора компаратора.

Те, кто преследовал ту же цель в более ранних версиях Mac OS X и / или iOS, должны использовать решение, описанное в Руководстве по программированию строк .

24
ответ дан 27 November 2019 в 05:36
поделиться