如何在NSArray上进行自然排序?

25 浏览
0 Comments

如何在NSArray上进行自然排序?

我有一个对象数组,我需要按照它们的“title”键进行排序。目前,虽然它可以工作,但它使用的是ASCII排序而不是自然排序。这些标题是文件名,所以它们看起来像这样:

file1

file2

file3

...

file10

file11

file12

我得到的结果如你所料:

file1

file10

file11

file12

file2

file3

...

是否有人知道是否有一种内置在NSArray排序功能中的方法可以获得自然排序而不是按字母顺序排序?我找到了一些通用的算法,但我希望有一些内置的方法。

0
0 Comments

问题的原因是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]; 
}];

0
0 Comments

问题出现的原因是在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中的解决方案来实现相同的排序行为。不过需要注意的是,文章中提供的链接已经失效,可能无法访问。

0
0 Comments

问题:如何在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上进行自然排序的问题。

0