如何首先使用具有特定名称的NSSortdescriptor,然后按名称排序?

时间:2014-10-02 13:48:44

标签: ios objective-c sorting nssortdescriptor

是否可以先使用NSSortDescriptor对给定值进行排序,然后在对象名称之后进行排序?

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

通缉结果:

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

2 个答案:

答案 0 :(得分:5)

排序描述符用于包含的对象符合KVO(响应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]];

修改

假设数组的元素实际上是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”更改为您要对托管对象进行排序的密钥路径。

答案 1 :(得分: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];
}

然后使用它来对数组进行排序。

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