在开头按字母顺序排序

0 cocoa objective-c

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

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

Vik*_*ica 5

你可以使用比较器块.

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

  • 检查两个字符串的第一个字母,它们是数字还是字母,做 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;
}];
Run Code Online (Sandbox Code Playgroud)

在使用时sortUsingDescriptors:,您必须使用NSMutableArray.您可以使用带有比较器的就地订购sortUsingComparator:.

[array sortUsingBlock:<The block stays the same>];
Run Code Online (Sandbox Code Playgroud)