【问题标题】:Sort an array with special characters - iPhone使用特殊字符对数组进行排序 - iPhone
【发布时间】:2010-03-22 13:08:14
【问题描述】:

我有一个带有法语字符串的数组,可以说:“égrener”和“exact”我想对它进行排序,例如 égrener 是第一个。当我这样做时:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

我得到列表末尾的 é... 我该怎么办?

谢谢

【问题讨论】:

    标签: iphone objective-c nsarray sorting


    【解决方案1】:

    NSString 中有一个方便的方法可以让您轻松地进行这种类型的排序:

    NSArray *sortedArray = [myArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    

    NSString 的底层比较方法 (compare:options:range:locale:) 为您提供了更多关于如何进行排序的选项。

    编辑:长篇大论:

    首先,定义一个比较函数。这对自然字符串排序很有用:

    static NSInteger comparator(id a, id b, void* context)
    {
        NSInteger options = NSCaseInsensitiveSearch
            | NSNumericSearch              // Numbers are compared using numeric value
            | NSDiacriticInsensitiveSearch // Ignores diacritics (â == á == a)
            | NSWidthInsensitiveSearch;    // Unicode special width is ignored
    
        return [(NSString*)a compare:b options:options];
    }
    

    然后,对数组进行排序。

        NSArray* myArray = [NSArray arrayWithObjects:@"foo_002", @"fôõ_1", @"fôõ_3", @"foo_0", @"foo_1.5", nil];
        NSArray* sortedArray = [myArray sortedArrayUsingFunction:comparator context:NULL];
    

    示例中的数组包含一些有趣的字符:数字、变音符号和 unicode 范围 ff00 中的一些字符。最后一种字符类型看起来像 ASCII 字符,但以不同的宽度打印。

    使用的比较函数以人类可预测的方式处理所有情况。排序后的数组顺序如下:

    foo_0
    fôõ_1
    foo_1.5
    foo_002
    fôõ_3
    

    【讨论】:

    • 谢谢,但我真的不明白如何实现它并按名称排序?
    • 关键是locale参数。您现在的问题是系统语言环境设置为英语。您需要将其设置为法语。您可以在系统或应用程序级别为法语应用程序执行此操作。如果您只是偶尔需要处理法语,您可以将适当的语言环境传递给排序,以便排序现在使用法语而不是英语排序。阅读 Apple Docs 中的本地化信息。听起来你会经常使用它。
    • 不明白……不是本地化的问题……是数组中特殊字符的问题!
    • 正如@ncohen 所说,这不是关于语言环境,而是关于选项。我提出的比较方法使用了一堆选项,它传递给compare:options:range:locale:。我刚刚提出了localizedCaseInsensitiveCompare,因为这是大多数用户对字典排序顺序的期望,而且使用起来非常方便。正如我所说,如果你想更好地控制比较方法对相等的要求,你应该使用底层的 compare:options:range:locale: 方法(你必须将它包装到一个 C 函数中才能使用它进行数组排序 @987654332 @)。
    • 顺便说一句。有问题的选项称为NSDiacriticInsensitiveSearch
    猜你喜欢
    • 2016-09-13
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2020-05-23
    • 2021-07-26
    • 2023-03-06
    • 2012-05-25
    相关资源
    最近更新 更多