0

我有一个这样的数组值:{apple,queen,microsoft,50cent}。我想对数组的字母顺序和最后的 50cent 进行排序。我正在使用以下方法,但它将 50cent 排序在顶部:

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

1 回答 1

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;
}];

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

[array sortUsingBlock:<The block stays the same>];
于 2012-04-30T09:51:38.833 回答