如何在NSArray上进行自然排序?
问题的原因是NSArray中的元素是NSString类型的,需要对这些字符串进行自然排序。而默认情况下,NSString的compare方法是按照字符的Unicode码进行比较的,这样会导致排序结果不符合自然排序的要求。
解决方法有三种:
第一种方法是使用NSString的compare方法,并指定compare option为NSNumericSearch。这样可以按照字符串中的数字进行比较,实现自然排序。具体实现如下:
NSInteger sort(Obj* a, Obj* b, void*) { return [[a title] compare:[b title] options:NSNumericSearch]; } result = [array sortedArrayUsingFunction:&sort context:nil];
第二种方法是使用更通用的方式,同样是使用NSString的compare方法,并指定compare option为NSNumericSearch。但是这种方式可以通过传递一个属性名的参数,可以对数组中的任意属性进行排序。具体实现如下:
NSInteger sort(id a, id b, void* p) { return [[a valueForKey:(NSString*)p] compare:[b valueForKey:(NSString*)p] options:NSNumericSearch]; } result = [array sortedArrayUsingFunction:&sort context:@"title"]
第三种方法是使用blocks。这种方式更简洁,可以直接在代码中使用匿名函数的方式进行排序。具体实现如下:
result = [array sortedArrayUsingComparator:^(Obj* a, Obj* b) { return [[a title] compare:[b title] options:NSNumericSearch]; }];
问题出现的原因是在Mac OS X 10.6及以后的版本和iOS 4及以后的版本中,尝试复制Finder的排序行为,需要使用localizedStandardCompare:作为比较器选择器。而在早期版本的Mac OS X和/或iOS上实现相同目标的人应该使用String Programming Guide中描述的解决方案。然而,所有的链接都已损坏。
解决方法是使用localizedStandardCompare:方法作为比较器选择器。这个方法可以按照自然排序的方式对字符串进行比较,即使字符串中包含数字和特殊字符,也能正确排序。对于早期版本的Mac OS X和iOS,可以参考String Programming Guide中的解决方案来实现相同的排序行为。
以下是一个示例代码,演示如何在NSArray上进行自然排序:
NSArray *array = @[@"file11.txt", @"file2.txt", @"file1.txt", @"file10.txt"]; NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSString *string1, NSString *string2) { return [string1 localizedStandardCompare:string2]; }]; NSLog(@"%@", sortedArray);
输出结果将会是:file1.txt, file2.txt, file10.txt, file11.txt。这是按照自然排序的方式对数组进行排序后的结果。
,要在NSArray上进行自然排序,可以使用localizedStandardCompare:方法作为比较器选择器。对于早期版本的Mac OS X和iOS,可以参考String Programming Guide中的解决方案来实现相同的排序行为。不过需要注意的是,文章中提供的链接已经失效,可能无法访问。
问题:如何在NSArray上进行自然排序?
原因:在开发过程中,有时候我们需要对数组中的元素进行自然排序,即按照数字的大小来排序,而不是字符串的字典序排序。然而,NSArray并没有提供直接对数组进行自然排序的方法。
解决方法:根据上述回答,如果我们使用的是一个字符串对象的数组,可以通过以下方式进行自然排序:
NSArray *unorderedTitles = @[ @"file12", @"file1", @"file10", @"file3", @"file2", @"file11" ]; NSArray *orderedTitles = [unorderedTitles sortedArrayUsingSelector:(localizedStandardCompare:)]; NSLog(@"orderedTitles = %@", orderedTitles); /* orderedTitles = ( file1, file2, file3, file10, file11, file12 ) */
以上代码中,我们首先创建了一个无序的字符串数组`unorderedTitles`,它包含了一些文件名。然后,我们使用`sortedArrayUsingSelector:`方法对该数组进行排序,并指定了排序的规则为`(localizedStandardCompare:)`。最后,我们打印出排序后的结果,可以看到,数组`orderedTitles`中的元素按照自然顺序进行了排序。
这样,我们就通过使用`sortedArrayUsingSelector:`方法,解决了在NSArray上进行自然排序的问题。