2017-12-25 8 views
0

助けてください。私はそれにカスタムオブジェクトを持つNSArrayを持っています。たとえばPersonのように、 'Mark'という名前のPersonは常に最後にあるはずです。それは 'sortUsingFunction'の助けを借りてそれを行うことは可能ですか?NSArray sortUsingFunctionカスタムオブジェクトは常に最後に

static NSInteger compareFunction(id item1, id item2, void *context) 
{ 
    Person *pItem1 = (Person *)item1; 
    Person *pItem2 = (Person *)item2; 

    if ([pItem1.name isEqual:@"Mark"]) 
    { 
     return NSOrderedDescending; 
    } 
} 

注: 私はそのようなものを推測し、ここでソート機能である、それはsortUsingFunction、ない他の関数でなければなりません。

答えて

0

はい、あなたの考えは実現可能です。ここにテストされた例があります:

NSArray *names = @[@"John",@"Mark",@"Sandy"]; 
NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) { 
    if ([obj1 isEqualToString:@"Mark"]) { 
     return NSOrderedDescending; 
    } 

    return [obj1 compare:obj2]; 
}]; 

NSLog(@"%@",markEndArray); 

//Output:  
    John, 
    Sandy, 
    Mark 
0

ユンチェンのバージョンは完全には動作しません。それが失敗した以下の名前としよう:

NSArray *names = @[ 
    @"John", 
    @"Noah", 
    @"Liam", 
    @"Mason", 
    @"Jacob", 
    @"William", 
    @"Ethan", 
    @"James", 
    @"Alexander", 
    @"Michael", 
    @"Mark", 
    @"Benjamin", 
    @"Elijah", 
    @"Daniel", 
    @"Aiden", 
    @"Logan", 
    @"Matthew", 
    @"Lucas", 
    @"Jackson", 
    @"David", 
    @"Oliver", 
    @"Jayden", 
    @"Sandy" 
]; 

間違った結果:それは完全に罰金する必要があります

NSArray *markEndArray = [names sortedArrayUsingComparator:^NSComparisonResult(NSString *_Nonnull obj1, NSString *_Nonnull obj2) { 
    if ([obj1 isEqualToString:@"Mark"]) { 
     return NSOrderedDescending; 
    } else if ([obj2 isEqualToString:@"Mark"]) { 
     return NSOrderedAscending; 
    } else { 
     return [obj1 compare:obj2]; 
    } 
}]; 

を:

Aiden, 
Alexander, 
Benjamin, 
Daniel, 
David, 
Elijah, 
Ethan, 
Jackson, 
Jacob, 
James, 
Jayden, 
John, 
Liam, 
Logan, 
Lucas, 
Matthew, 
Oliver, 
Sandy, 
Mark, 
Mason, 
Michael, 
Noah, 
William 

あなたはこのようにそれを拡張する必要があります!

関連する問題