2014-10-02 70 views
1

是否可以使用NSSortDescriptor对给定值进行排序,然后按照对象的名称进行排序?如何先使用NSSortdescriptor与特定名称,然后按名称排序?

NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"] 

通缉的结果:

NSArray *sortedvalues = @[@"Me", @"Aardvark",@"Fish", @"Turtle"] 
+2

它必须是一个排序描述符?使用比较器很容易,但排序描述符要求数组包含符合KVO的对象。 – danh 2014-10-02 14:07:21

+0

使用它与取得的结果控制器 – hakonbogen 2014-10-02 14:18:00

回答

5

的排序描述符是在收容的对象是符合志愿(响应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”更改为要对其排序托管对象的键路径。

+0

看起来像一个很好的解决方案,我用它取得的结果控制器,所以我实际上没有结果数组 – hakonbogen 2014-10-02 14:18:44

+0

你的意思是数组并不真正包含字符串? – danh 2014-10-02 14:24:20

+0

是的,它的名字属性的对象 – hakonbogen 2014-10-02 14:25:25

0

可以创造一种描述有这样一个比较...

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]; 
} 

然后用它来排序您的阵列。

如果不需要排序描述符,则只需使用比较器对数组进行排序。

+1

这也是我最初的想法,但比较器需要准备好将“我”看作左手或右手操作数。 – danh 2014-10-02 14:12:32

+0

@danh啊是啊,好点。 – Fogmeister 2014-10-02 14:12:54