按字母顺序排序NSArray,避免使用某些字符

时间:2013-01-25 22:48:59

标签: ios objective-c nsmutablearray nssortdescriptor

我有一个NSArray对象(不是NSStrings,而是自定义对象)。每个对象都有一个值obj.name我知道如何按名称对NSMutableArray进行排序,如下所示

 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
 [array sortUsingDescriptors:[NSArray arrayWithObject:sort]];

但是,有些名称以“The”,“A”或“An”开头,如果它们出现,我想跳到名称中的下一个单词。无论如何要避免这三种情况,如果它们出现,会自动切换到下一个单词吗?

4 个答案:

答案 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];