对许多包含数字的NSArray进行排序

时间:2011-01-03 21:29:20

标签: ios objective-c iphone cocoa-touch nsarray

我有一个NSArray,其中填充了来自NSMutableArray的对象。这些对象中的大多数具有整数值,如“1”,“2”,“3”,“4”,“5”,有时会有“home”,“far left”或“far right”这样的名称。我正在尝试使用sortedArrayUsingSelector在Objective C中对此数组进行排序:@selector(compare :)在数组中少于10个项目时工作正常。但是当它还有更多我开始得到“1”,“10”,“11”,“12”,“2”,“3”类型的东西。非常感激任何的帮助。代码不应返回任何内容。它只需要排序并继续前进。

原始代码:

presetNamesSort = [[[NSMutableArray alloc]init]retain];

presetNamesSort = [presetNames sortedArrayUsingSelector:@selector(compare:)];

3 个答案:

答案 0 :(得分:42)

您可以使用NSArray的{​​{1}}方法使用自定义块获取已排序的数组。我发现这比-sortedArrayUsingComparator:更方便,因为您可以内联声明比较器,如下所示:

-sortedArrayUsingSelector:

这将返回一个如下所示的数组:

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];

一般来说,使用块非常好,因为它们无需在代码中创建运行amuk的随机选择器。

答案 1 :(得分:1)

尝试将-[NSString compare:options:]NSNumericSearch一起使用。要将其与-sortedArrayUsingSelector:一起使用,您必须将比较调用包装到NSString上的单独类别方法中:

- (NSComparisonResult)numericCompare:(NSString *)aString {
    return [self compare:aString options:NSNumericSearch];
}

答案 2 :(得分:0)

用于排序降序

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];
sortedArray = [[sortedArray reverseObjectEnumerator] allObjects];`

升序

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];