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

Ios 按字母顺序对NSArray排序,避免使用某些字符,ios,objective-c,nsmutablearray,nssortdescriptor,Ios,Objective C,Nsmutablearray,Nssortdescriptor,我有一个对象的NSArray(不是nsstring,而是自定义对象)。每个对象都有一个值obj.name我知道如何按名称对NSMutableArray进行排序,如下所示 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; [array sortUsingDescriptors:[NSArray arrayWithObject:sort]]; 然而,有些名字以“the

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

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

然而,有些名字以“the”、“A”或“An”开头,如果它们出现,我想跳到名字中的下一个单词。有没有办法避免这三种情况,并在它们出现时自动切换到下一个单词?

我建议执行“sortUsingSelector”,这将允许您编写自己的排序方法。然后,您可以对这些条件执行三次检查,然后返回比较的两个字符串。

我建议执行“sortUsingSelector”,这将允许您编写自己的排序方法。然后,您可以对这些条件进行三次检查,然后返回比较的两个字符串。

您可以使用
sortedarrayingselector

签出

您可以使用选择器进行分类。
查看

您必须实现自己的比较功能,就像这样(非常粗糙,可以做得更优雅,但只是作为概念证明):

然后使用该函数调用
sortedarrayingfunction

sortedArray = [array sortedArrayUsingFunction:myCompare context:NULL];

您必须实现自己的比较函数,如下所示(非常粗糙,可以做得更优雅,但只是作为概念证明):

然后使用该函数调用
sortedarrayingfunction

sortedArray = [array sortedArrayUsingFunction:myCompare context:NULL];

如果我敢反对迄今为止发布的所有答案,那么对于您的文字问题,最简单的答案是在您的自定义类上实现一个getter,该getter返回调整后的字符串:

- (NSString *)canonicalName
{
    if([self.name rangeOfString:@"The "].location == 0)
        return [self.name subStringFromIndex:4];

    // etc, etc
}
然后通过向排序描述符指定“canonicalName”进行排序

不过,您应该首先考虑以下建议,并使用<代码> NScord固有的能力,按照查找者所应用的相同规则对其进行排序,我认为超集是您试图实现的规则。因此,您希望通过

本地化比较:
来比较字符串,这从一开始就在iOS上可用。否则,你几乎是在重新发明一个不平凡的轮子

例如


如果我敢反对迄今为止发布的所有答案,那么对于您的文字问题,最简单的答案是在您的自定义类上实现一个getter,该getter返回调整后的字符串:

- (NSString *)canonicalName
{
    if([self.name rangeOfString:@"The "].location == 0)
        return [self.name subStringFromIndex:4];

    // etc, etc
}
然后通过向排序描述符指定“canonicalName”进行排序

不过,您应该首先考虑以下建议,并使用<代码> NScord固有的能力,按照查找者所应用的相同规则对其进行排序,我认为超集是您试图实现的规则。因此,您希望通过

本地化比较:
来比较字符串,这从一开始就在iOS上可用。否则,你几乎是在重新发明一个不平凡的轮子

例如


您的另一个选择是第二次存储名称字段,去掉“冒犯性”字符。我同意热舔。以“Apple,A”或“Apple,the”的形式存储额外的sortName以进行排序。这是一种更简单、更好的数据设计。也许将来会有更多的前缀…如果这些是用户输入的值,你可能也想处理其他语言,因为“a”、“an”和“the”显然只适用于英语。你的另一个选择是第二次存储名称字段,去掉“冒犯性”字符。我同意热舔。以“Apple,A”或“Apple,the”的形式存储额外的sortName以进行排序。这是一种更简单、更好的数据设计。也许将来会有更多的前缀…如果这些是用户输入的值,您可能也需要处理其他语言,因为“a”、“an”和“the”显然只适用于英语。