是否可以使用NSSortDescriptor对给定值进行排序,然后按照对象的名称进行排序?如何先使用NSSortdescriptor与特定名称,然后按名称排序?
NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"]
通缉的结果:
NSArray *sortedvalues = @[@"Me", @"Aardvark",@"Fish", @"Turtle"]
是否可以使用NSSortDescriptor对给定值进行排序,然后按照对象的名称进行排序?如何先使用NSSortdescriptor与特定名称,然后按名称排序?
NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"]
通缉的结果:
NSArray *sortedvalues = @[@"Me", @"Aardvark",@"Fish", @"Turtle"]
的排序描述符是在收容的对象是符合志愿(响应valueForKey :)。用比较做到这一点的方法是...
NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"];
NSComparisonResult (^comparator)(id,id) = ^(id left, id right) {
if ([left isEqualToString:@"Me"]) return NSOrderedAscending;
if ([right isEqualToString:@"Me"]) return NSOrderedDescending;
return [left compare:right];
};
NSArray *sortedValues = [values sortedArrayUsingComparator:comparator];
我想你可以添加一个空的关键路径,并使用排序描述符(感谢@Prince),但它似乎是一个额外的步骤...
// define the comparator as above
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES comparator:comparator];
NSArray *sorted = [values sortedArrayUsingDescriptors:@[sd]];
EDIT
说出数组的元素是真正KVO对象。然后,排序描述符更自然。只要将上面给出的想法应用于字符串的关键路径,例如
NSDictionary *kvo0 = @{ @"prop": @"Fish"};
NSDictionary *kvo1 = @{ @"prop": @"Me"};
NSDictionary *kvo2 = @{ @"prop": @"Ardvark"};
NSDictionary *kvo3 = @{ @"prop": @"Turtle"};
NSArray *values = @[kvo0, kvo1, kvo2, kvo3];
NSComparisonResult (^comparator)(id,id) = ^(id left, id right) {
if ([left isEqualToString:@"Me"]) return NSOrderedAscending;
if ([right isEqualToString:@"Me"]) return NSOrderedDescending;
return [left compare:right];
};
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"prop" ascending:YES comparator:comparator];
NSArray *sorted = [values sortedArrayUsingDescriptors:@[sd]];
您需要将@“prop”更改为要对其排序托管对象的键路径。
看起来像一个很好的解决方案,我用它取得的结果控制器,所以我实际上没有结果数组 – hakonbogen 2014-10-02 14:18:44
你的意思是数组并不真正包含字符串? – danh 2014-10-02 14:24:20
是的,它的名字属性的对象 – hakonbogen 2014-10-02 14:25:25
可以创造一种描述有这样一个比较...
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES comparator:^(NSString *string1, NSString *string2) {
if ([string1 isEqualToString:@"Me"]){
return NSOrderedAscending;
}
// edited thanks to @danh
if ([string2 isEqualToString:@"Me"]){
return NSOrderedDescending;
}
return [string1 compare:string2];
}
然后用它来排序您的阵列。
如果不需要排序描述符,则只需使用比较器对数组进行排序。
这也是我最初的想法,但比较器需要准备好将“我”看作左手或右手操作数。 – danh 2014-10-02 14:12:32
@danh啊是啊,好点。 – Fogmeister 2014-10-02 14:12:54
它必须是一个排序描述符?使用比较器很容易,但排序描述符要求数组包含符合KVO的对象。 – danh 2014-10-02 14:07:21
使用它与取得的结果控制器 – hakonbogen 2014-10-02 14:18:00