Я хочу отсортировать массив с помощью NSSortDescriptor - PullRequest
71 голосов
/ 04 апреля 2011

У меня проблема с сортировкой массива по базе данных:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 
[sorter release];

Здесь в базе данных есть несколько первых заглавных букв, и из-за этой заглавной буквы она не показывает мне правильно отсортированный вывод.Здесь я сортирую массив с rt "w", который является моим столбцом таблицы в базе данных.Здесь я приложил снимок экрана для вывода, который говорит, что «Рак» идет первым, чем «с», но это не правильно, он не дает сортировку по алфавиту из-за заглавных слов.

например.если в нижнем регистре есть «способность» и «aCid», то сначала будет показан «aCid», а затем «возможность», а также возможен случай, когда, если первая буква является заглавной, она идет первой, например «Able» и «a».Здесь Able отображается первым. enter image description here

Ответы [ 7 ]

168 голосов
/ 04 апреля 2011

Посмотрите здесь: Создание и использование дескрипторов сортировки

Вы можете сравнивать как без учета регистра.

NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
          initWithKey:@"w"
          ascending:YES
          selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 
39 голосов
/ 15 февраля 2013

Просто используйте NSSortDescriptor, как я использовал, и он работал нормально.

   NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
5 голосов
/ 24 января 2012

Могу ли я предложить использовать -localizedStandardCompare: (NSString)?

"Этот метод следует использовать всякий раз, когда имена файлов или другие строки представлены в списках и таблицах, где сортировка по типу Finder уместна. Точное поведение сортировкиэтот метод отличается в разных локалях и может быть изменен в будущих выпусках. "

3 голосов
/ 03 сентября 2012

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

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];

NSArray *sortDescriptors = [NSArray arrayWithObject:sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors];

Этот код отлично подходит для сортировки имени по алфавиту, который также имеет маленький символ, то есть Рокки, Аджай, Джон, Боб и т. Д.

2 голосов
/ 28 июня 2013

Альтернативная форма сортировки искателя Apple с использованием метода локали использует блок компаратора, полезный, если вы находитесь в среде ARC и не хотите иметь дело с бросками мостов и т. Д.Также для сохранения эффективности рекомендуется хранить текущую локаль в локальной переменной.

2 голосов
/ 09 февраля 2012

Этот код отлично работает для меня.

- (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];
}
2 голосов
/ 05 апреля 2011

Я думаю, это поможет вам.Документы для этого здесь: Руководство по программированию строки

Добавьте эту небольшую функцию, написанную 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]];

Ваши результаты будут выглядеть так:

  • c
  • каюта
  • кафе
  • Рак
  • Китайский
  • Христианство
  • Рождество
  • Кокс
...