在开头按字母顺序排序

时间:2012-04-30 09:21:16

标签: objective-c cocoa

我有一个像这样的数组值:{apple,queen,microsoft,50cent}。我想按顺序排列数组的字母顺序和50cent。我正在使用以下方法,但它将50cent排在最前面:

[albums sortUsingDescriptors:[NSArray arrayWithObject:
                                  [[[NSSortDescriptor alloc] 
                                    initWithKey:@"name" 
                                    ascending:YES 
                                    selector:@selector(localizedCaseInsensitiveCompare:)] 
                                   autorelease]]];

1 个答案:

答案 0 :(得分:5)

您可以使用comparator blocks

在您的情况下,该块应该执行以下操作:

  • 检查两个字符串的第一个字母,无论是数字还是字母,请return [obj1 compare:obj2]

  • 如果第一个对象以数字开头,而第二个对象以字母return NSOrderedAscending开头,如果是相反的话,return NSOrderedDescending

获取第一个字母,请使用[obj1 substringToIndex:1]


这个想法的完整代码:

NSArray *array = [NSArray arrayWithObjects:@"peach",@"apple",@"banana",@"ananas",@"50cents", @"papaya", nil];

array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *s1 = [obj1 substringToIndex:1];
    NSString *s2 = [obj2 substringToIndex:1];

    if ([s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == [s2 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location) {
        return  [obj1 compare:obj2];
    } else {
        if ([s1 rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == NSNotFound) {
            return NSOrderedAscending;
        }
    }
    return  NSOrderedDescending;
}];

当您使用sortUsingDescriptors:时,您必须使用NSMutableArray。您可以使用sortUsingComparator:的比较器进行就地排序。

[array sortUsingBlock:<The block stays the same>];