Я хочу сортировать массив с помощью NSSortDescriptor
У меня возникла проблема с сортировкой массива w.r.t:
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
[sorter release];
Здесь в базе данных есть несколько первых заглавных букв, и из-за этой прописной буквы он не показывает мне правильный сортированный вывод. Здесь я сортирую массив с r.t "w", который является моим столбцом таблицы в базе данных.
Здесь я прилагаю скриншот для вывода, в котором говорится, что "Рак" на первом месте, чем "c", но это неверно, он не отдает алфавитно сортировку из-за заглавных слов.
например. если есть "способный" в нижнем регистре и "aCid", тогда он сначала покажет aCid, а затем сможет, и есть также случай, когда первая буква является кепкой, она наступает, например, "Able" и "a". Здесь сначала отображается Able. ![enter image description here]()
Ответы
Ответ 1
Взгляните сюда:
Создание и использование дескрипторов сортировки
Вы можете сравнить нечувствительность к регистру.
NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
initWithKey:@"w"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
Ответ 2
Просто используйте NSSortDescriptor, как я использовал, и он отлично работал.
NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
Ответ 3
Могу ли я предложить использовать -localizedStandardCompare: (NSString)?
"Этот метод следует использовать всякий раз, когда имена файлов или другие строки представлены в списках и таблицах, где подходит сортировка по поисковому запросу. Точное поведение сортировки этого метода различно в разных локалях и может быть изменено в будущих выпусках."
Ответ 4
Вы можете использовать это для сортировки массива по имени, которое также содержит маленькую букву:
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObject:sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];
Этот код отлично подходит для сортировки имени в соответствии с алфавитами, которые также имеют небольшой характер, например, скалистый, Ajay, john, Bob и т.д.
Ответ 5
Я думаю, что это поможет вам. Документы для этого находятся здесь:
Руководство по программированию строк
Добавьте эту небольшую функцию, написанную Apple.
int finderSortWithLocale(id string1, id string2, void *locale)
{
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2
options:comparisonOptions
range:string1Range
locale:(NSLocale *)locale];
}
Убедитесь, что вы скопировали определение функции в свой заголовок, или вы получите ошибку компиляции в отсортированном массиве.
Для вашего отсортированного массива используйте этот метод:
[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];
Ваши результаты будут выглядеть так:
- с
- каюта
- кафе
- Рак
- китайский
- Христианство
- Рождество
- Кокс
Ответ 6
Этот код работает отлично для меня.
- (void)sortSearchResultWithInDocumentTypeArray:(NSMutableArray *)aResultArray basedOn:(NSString *)aSearchString {
NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES comparator:^(id firstDocumentName, id secondDocumentName) {
static NSStringCompareOptions comparisonOptions =
NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
return [firstDocumentName compare:secondDocumentName options:comparisonOptions];
}];
NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil];
[aResultArray sortUsingDescriptors:descriptors];
}
Ответ 7
Альтернативный вид сортировки Apple finder с использованием метода locale использует блок-компаратор, полезный, если вы находитесь в среде ARC и не хотите иметь дело с мостами-переходами и т.д.:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"your_string_key" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSRange string1Range = NSMakeRange(0, ((NSString *)obj1).length);
return [(NSString *)obj1 compare: (NSString *)obj2 options: comparisonOptions range: string1Range locale: [NSLocale currentLocale]];
}];
NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[sortDescriptor]];
Я бы тоже рекомендовал хранить текущую локаль в локальной переменной для эффективности.