Я хочу сортировать массив с помощью 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]];

Я бы тоже рекомендовал хранить текущую локаль в локальной переменной для эффективности.