是否可以使用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