Objective C通过搜索字符串首字母搜索排序搜索结果

时间:2014-11-09 16:55:32

标签: objective-c nsstring nsarray

查看文档并很难确定是否有一种简单的方法可以根据搜索查询的第一个字母对搜索结果进行排序。即我想显示所有搜索结果的字母' n'但是以' n'开头的条目到阵列的前面。数据库很大,我能想到的唯一方法就是通过取出所有的 来过滤排序的字母数组。条目并将它们添加到字母数组的开头。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用块比较器:

NSString *prefix = [@"n" uppercaseString];
NSArray *sortedArray = [arrayNotSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b)
{
    if ([[(NSString*)a uppercaseString] hasPrefix:prefix] && ![[(NSString*)b uppercaseString] hasPrefix:prefix])
        return NSOrderedAscending;
    else if (![[(NSString*)a uppercaseString] hasPrefix:prefix] && [[(NSString*)b uppercaseString] hasPrefix:prefix])
        return NSOrderedDescending;
    else
        return [a caseInsensitiveCompare:b];
}];

使用(输出NSLog)测试:

>ArrayNotSorted: (
    Hello,
    NLow,
    nHi,
    Bo,
    "What?",
    NBA
)
>SortedArray: (
    NBA,
    nHi,
    NLow,
    Bo,
    Hello,
    "What?"
)

这里有几件事:
•我投了" a"和" b",以防您使用除NSString之外的其他对象。例如,如果对象的类型为:

ClassCustom
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int someValue;

你可以这样做:
NSString *aObjectToCompare = [(ClassCustom *)a name];代替(NSString *)a

•我最后也使用了caseInsensitiveCompare:。但如果更多的话,你可以使用compare: •我使用upperCaseString方法来避免" n"或" N"问题。但你也可以删除它,也许可以添加其他" if / else"如果你想要大写或小写的话。