Сортировать массив со специальными символами - iPhone - PullRequest
2 голосов
/ 22 марта 2010

У меня есть массив с французскими строками, пусть говорят: «égrener» и «точный», я хотел бы отсортировать его, например, égrener - первый. Когда я делаю:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

Я получаю é в конце списка ... Что мне делать?

Спасибо

1 Ответ

7 голосов
/ 22 марта 2010

В NSString есть удобный метод, позволяющий легко выполнять сортировку этого типа: базовый метод сравнения

NSArray *sortedArray = [myArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

NSString (compare:options:range:locale:) даету вас есть еще больше возможностей для сортировки.

Редактировать: Вот длинный рассказ:

Сначала определите функцию сравнения.Это хорошо для естественной сортировки строк:

static NSInteger comparator(id a, id b, void* context)
{
    NSInteger options = NSCaseInsensitiveSearch
        | NSNumericSearch              // Numbers are compared using numeric value
        | NSDiacriticInsensitiveSearch // Ignores diacritics (â == á == a)
        | NSWidthInsensitiveSearch;    // Unicode special width is ignored

    return [(NSString*)a compare:b options:options];
}

Затем сортируйте массив.

    NSArray* myArray = [NSArray arrayWithObjects:@"foo_002", @"fôõ_1", @"fôõ_3", @"foo_0", @"foo_1.5", nil];
    NSArray* sortedArray = [myArray sortedArrayUsingFunction:comparator context:NULL];

Массив в примере содержит несколько забавных символов: числа, диакритические знаки и некоторыесимволы из диапазона Юникод ff00.Последний тип символа выглядит как символ ASCII, но напечатан с другой шириной.

Используемая функция сравнения обрабатывает все случаи предсказуемым образом.Сортированный массив имеет следующий порядок:

foo_0
fôõ_1
foo_1.5
foo_002
fôõ_3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...