2014-10-02 72 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