对NSString类型的NSArray进行排序

21

有人可以给我展示一下如何对NSMutableArray进行排序的代码吗?我有以下NSMutableArray:

NSMutableArray *arr = [[NSMutableArray alloc] init];

这个列表包含元素 "2"、"4"、"5"、"1"、"9" 等等,它们都是 NSString 类型。

我想要按降序排序,以便列表中最大的数值整数在列表中排在最前面(索引0)。

我尝试了以下代码:

[arr sortUsingSelector:@selector(compare:)];

但是它似乎没有正确地对我的值进行排序。

有人可以给我展示正确执行我想要实现的代码吗?谢谢!

5个回答

57

你应该使用这个方法:

[arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

在一个NSArray中或者:

[arr sortUsingSelector:@selector(caseInsensitiveCompare:)];

在“原地”排序的NSMutableArray中,比较器应返回以下值之一:

  • NSOrderedAscending
  • NSOrderedDescending
  • NSOrderedSame

我尝试了第二种方法,这是一个排序数组的输出: - CodeGuy
2
2, 2, 2, 2, 3, 3, 32, 4, 47, 477, 56, 7, 8 - CodeGuy
你需要替换示例中给出的比较器,我不知道你的排序“标准”是什么 :) - HyLian

19

编写自己的字符串比较方法非常简单:

@implementation NSString(compare)

-(NSComparisonResult)compareNumberStrings:(NSString *)str {
    NSNumber * me = [NSNumber numberWithInt:[self intValue]];
    NSNumber * you = [NSNumber numberWithInt:[str intValue]];

    return [you compare:me];
}

@end

18
如果数组的元素只是带有数字而没有字母的NSString(例如“8”,“25”,“3”等),那么下面是一种干净简短且实际有效的方法:
NSArray *sortedArray = [unorderedArray sortedArrayUsingComparator:^(id a, id b) {
    return [a compare:b options:NSNumericSearch];
}];

完成了!不需要编写一个返回NSComparisonResult的整个方法,也不需要八行NSSortDescriptor...


1
你需要将a和b声明为“id”,否则Xcode会产生错误:[unorderedArray sortedArrayUsingComparator:^(id a, id b) {...}]; - Martin
它还可以处理包含非数字的字符串,例如“文件1”,“文件2”等等。然后,它将正确地将“文件2”排序在“文件12”之前。 - Thomas Tempelmann

5

我认为,最简单的方法是对这样的数组进行排序

[arr sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self.intValue" ascending:YES]]]

如果您的数组包含浮点数值,只需将键更改为self.floatValueself.doubleValue

2
最简单的方法是编写一个比较器方法,像这样:
NSArray *sortedStrings = [stringsArray sortedArrayUsingComparator:^NSComparisonResult(NSString *firstString, NSString *secondString) {
    return [[firstString lowercaseString] compare:[secondString lowercaseString]];
}];

当字符串中包含数字时(如问题中所示),这将无法帮助。 - ReDetection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接