我想使用NSSortDescriptor对数组进行排序

时间:2011-04-04 18:37:52

标签: iphone nsarray jquery-ui-sortable sorting

我遇到了关于对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”之后,但这不正确,因为大写单词而没有按字母顺序排序。

例如。如果小写中有“able”和“aCid”那么它将首先显示aCid然后能够显示aCid,并且还存在如果第一个字母是大写字母它首先出现的情况,例如“Able”和“a”。这里Able首先显示。enter image description here

7 个答案:

答案 0 :(得分:168)

看看这里: Creating and Using Sort Descriptors

您可以按不区分大小写进行比较。

NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
          initWithKey:@"w"
          ascending:YES
          selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors]; 

答案 1 :(得分:39)

只需像我使用的那样使用NSSortDescriptor,它工作正常。

   NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

答案 2 :(得分:5)

我建议使用-localizedStandardCompare:(NSString)?

“只要文件名或其他字符串出现在适合类似Finder的排序的列表和表格中,就应该使用此方法。此方法的精确排序行为在不同的语言环境下是不同的,并且可能在将来的版本中进行更改。”

答案 3 :(得分:3)

您可以根据名称包含小写字母来使用它来排序数组:

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

NSArray *sortDescriptors = [NSArray arrayWithObject:sorter]; 

[mGlossaryArray sortUsingDescriptors:sortDescriptors];

这段代码对我来说很好,可以根据字母排序,这些字母也有小字符,即岩石,Ajay,john,Bob等。

答案 4 :(得分:2)

我认为这会为你做到这一点。它的文档在这里: String Programming Guide

添加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
  • 小屋
  • 咖啡馆
  • 癌症
  • 中国
  • 基督教
  • 圣诞

答案 5 :(得分:2)

这段代码对我来说很好。

- (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];
}

答案 6 :(得分:2)

使用区域设置方法的Apple查找器排序的另一种形式使用比较器块,如果您在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]];

我也建议将当前语言环境存储在本地变量中以提高效率。