代码之家  ›  专栏  ›  技术社区  ›  Nate

使用特殊字符对数组排序-iPhone

  •  2
  • Nate  · 技术社区  · 14 年前

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

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

    谢谢

    1 回复  |  直到 14 年前
        1
  •  8
  •   Nikolai Ruhe    14 年前

    这里面有一个方便的方法 NSString

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

    NSString字符串 s基本比较法( 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