我有一个NSArray对象(不是NSStrings,而是自定义对象)。每个对象都有一个值obj.name
我知道如何按名称对NSMutableArray进行排序,如下所示
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[array sortUsingDescriptors:[NSArray arrayWithObject:sort]];
但是,有些名称以“The”,“A”或“An”开头,如果它们出现,我想跳到名称中的下一个单词。无论如何要避免这三种情况,如果它们出现,会自动切换到下一个单词吗?
答案 0 :(得分:5)
如果我敢与迄今为止发布的所有答案相悖,那么对你的文字问题最简单的答案就是在你的自定义类上实现一个getter,返回调整后的字符串:
- (NSString *)canonicalName
{
if([self.name rangeOfString:@"The "].location == 0)
return [self.name subStringFromIndex:4];
// etc, etc
}
然后通过为排序描述符指定'canonicalName'来排序。
但是,您应该首先考虑遵循QA1159中的建议,并根据Finder应用的相同规则使用NSString
的固有能力进行自我排序,我认为这取决于您的规则正在努力实施。因此,您希望最终通过localizedCompare:
比较字符串,这一点从一开始就在iOS上提供。你正在重新发明一个非平凡的轮子。
E.g。
[array sortUsingComparator:
^NSComparisonResult(YourObjectType *obj1, YourObjectType *obj2)
{
return [obj1.name localizedCompare:obj2.name];
}];
答案 1 :(得分:3)
我建议执行一个“sortUsingSelector”,它允许你编写自己的排序方法。然后,您可以对这些条件执行三次检查,然后返回两个字符串进行比较。
答案 2 :(得分:1)
您可以使用sortedArrayUsingSelector
。
查看NSArray Class Reference
答案 3 :(得分:1)
你必须实现自己的比较功能,就像这样(它非常粗糙,它可以更优雅地完成,但仅作为概念证明):
static NSInteger myCompare(NSString *obj1, NSString *obj2, void *context)
{
NSString *str1;
if ([obj1 hasPrefix:@"A "]) str1 = [obj1 substringFromIndex:2];
else if ([obj1 hasPrefix:@"An "]) str1 = [obj1 substringFromIndex:3];
else if ([obj1 hasPrefix:@"The "]) str1 = [obj1 substringFromIndex:4];
else str1 = obj1;
NSString *str2;
if ([obj2 hasPrefix:@"A "]) str2 = [obj2 substringFromIndex:2];
else if ([obj2 hasPrefix:@"An "]) str2 = [obj2 substringFromIndex:3];
else if ([obj2 hasPrefix:@"The "]) str2 = [obj2 substringFromIndex:4];
else str2 = obj2;
return [str1 compare:str2];
}
然后使用它致电sortedArrayUsingFunction
:
sortedArray = [array sortedArrayUsingFunction:myCompare context:NULL];