我有一个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:)];
答案 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];
}];