2016-11-11 2 views
0

Ich habe NSSArray mit benutzerdefinierten Objekten, um das benutzerdefinierte Objekt mit benutzerdefinierten LogikNSArray von Objekten Sortierung mit Angepasste Logik

Benutzerdefinierte Objekt mit zwei Eigenschaft zu sortieren:
@property (nonatomic, strong) NSString *objectName;
@property (nonatomic, assign) BOOL isValidName;

wenn isValidName Eigenschaft false , Dann sollte das benutzerdefinierte Objekt die letzte Sortierreihenfolge sein. Für die Objekte ist die isValidName-Eigenschaft true. Dann sollte sie mit der Eigenschaft objectName in aufsteigender Reihenfolge sortiert werden.

Ich kann mit for loop durch das Finden von Objekten mit der Eigenschaft isValidName false dann die Objekte aus dem Array entfernen und dann das Array danach sortieren kann ich die Objekte hinzufügen, die Eigenschaft isValidName false haben. Ich will das nicht machen.

Ich möchte, dass etwas wie unten Option, aber es funktioniert nicht. Bitte helfen in Bezug

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     NSArray *sortedTopics = [obj sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ 
      if (obj1.isValidName) { 
       return NSOrderedAscending; 
      } 
      return [obj1.objectName compare: obj2.objectName options:NSCaseInsensitiveSearch]; 
     }]; 
     obj = sortedTopics; 

    }]; 

Antwort

1

ich wirklich das Zeug hast du neu erstellt tun sie nicht, aber ich hoffe, dass dies für Sie arbeiten würde: arr NSMutableArray

NSSortDescriptor *validSort = [[NSSortDescriptor alloc] initWithKey:@"isValidName" ascending:NO]; 
NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES]; 

[arr sortUsingDescriptors:[NSArray validSort, nameSort, nil]]; 

so sein sollte, wenn Ihr object.isValidName false = es wird Push-to nach dem einen haben es wahr und sortieren nach auch

0

Namen Versuchen NSPredicate

NSMutableArray *arrFinalSortedArray = [NSMutableArray new]; 

NSArray *yourObjectArray = @[@{@"isValidName":@"YES" ,@"objectName":@"ABC"},@{@"isValidName":@"NO",@"objectName":@"EFG"},@{@"isValidName":@"YES",@"objectName":@"BCD"},@{@"isValidName":@"YES",@"objectName":@"CDE"},@{@"isValidName":@"NO",@"objectName":@"DEF"}]; 

    // filter for NO flag 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isValidName ==[c] %@", @"NO"]; 
    NSArray *NOContainerArray = [yourObjectArray filteredArrayUsingPredicate:predicate]; 
    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"objectName" ascending:YES]; 
    NOContainerArray = [NOContainerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 

    // filter for NO flag 
    predicate = [NSPredicate predicateWithFormat:@"isValidName ==[c] %@", @"YES"]; 
    NSArray *YESContainerArray = [yourObjectArray filteredArrayUsingPredicate:predicate]; 
    descriptor = [NSSortDescriptor sortDescriptorWithKey:@"objectName" ascending:YES]; 
    YESContainerArray = [YESContainerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 

    // add to all YES and NO array into the final array which is the your result 
    [arrFinalSortedArray addObjectsFromArray:YESContainerArray]; 
    [arrFinalSortedArray addObjectsFromArray:NOContainerArray]; 
    NSLog(@"%@",arrFinalSortedArray); 
0

Ich glaube, Sie hatten es fast, aber Sie sollten nicht enumerateObjectsUsingBlock verwenden. Stattdessen sortedArrayUsingComparator verwenden und das Ergebnis in ein neues Array zuweisen:

NSArray *sortedTopics = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ 
    if (!obj1.isValidName) 
     return NSOrderedDescending; 
    return [obj1.objectName compare: obj2.objectName options:NSCaseInsensitiveSearch]; 
}]; 

Wenn Sie eine NSMutableArray haben Sie sortUsingComparator: auf sie aufrufen können stattdessen und vermeiden ein neues Array erstellen.

Verwandte Themen