How do I sort an NSMutableArray with custom objects in it?

前端 未结 27 3240
予麋鹿
予麋鹿 2020-11-21 04:45

What I want to do seems pretty simple, but I can\'t find any answers on the web. I have an NSMutableArray of objects, and let\'s say they are \'Person\' objects

相关标签:
27条回答
  • 2020-11-21 05:03

    Sort using NSComparator

    If we want to sort custom objects we need to provide NSComparator, which is used to compare custom objects. The block returns an NSComparisonResult value to denote the ordering of the two objects. So in order to sort whole array NSComparator is used in following way.

    NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
        return [e1.firstname compare:e2.firstname];    
    }];
    

    Sorts Using NSSortDescriptor
    Let’s assume, as an example, that we have an array containing instances of a custom class, Employee has attributes firstname, lastname and age. The following example illustrates how to create an NSSortDescriptor that can be used to sort the array contents in ascending order by the age key.

    NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    NSArray *sortDescriptors = @[ageDescriptor];
    NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];
    

    Sort using Custom Comparisons
    Names are strings, and when you sort strings to present to the user you should always use a localized comparison. Often you also want to perform a case insensitive comparison. Here comes an example with (localizedStandardCompare:) to order the array by last and first name.

    NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
                  initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
                  initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
    NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];
    

    For reference and detailed discussion please refer: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
    http://www.ios-blog.co.uk/tutorials/objective-c/how-to-sort-nsarray-with-custom-objects/

    0 讨论(0)
  • 2020-11-21 05:03
      let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
     }
    
    0 讨论(0)
  • 2020-11-21 05:06

    You have to create sortDescriptor and then you can sort the nsmutablearray by using sortDescriptor like below.

     let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
     let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
     print(array)
    
    0 讨论(0)
  • 2020-11-21 05:07

    There is a missing step in Georg Schölly's second answer, but it works fine then.

    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                                  ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray;
    sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];
    

    // added the 's' because time was wasted when I copied and pasted and it failed without the 's' in sortedArrayUsingDescriptors

    0 讨论(0)
  • 2020-11-21 05:09

    You can use the following generic method for your purpose. It should solve your issue.

    //Called method
    -(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
        NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
        [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
        return arrDeviceList;
    }
    
    //Calling method
    [self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];
    
    0 讨论(0)
  • 2020-11-21 05:10

    Swift version: 5.1

    If you have a custom struct or class and want to sort them arbitrarily, you should call sort() using a trailing closure that sorts on a field you specify. Here's an example using an array of custom structs that sorts on a particular property:

        struct User {
            var firstName: String
        }
    
        var users = [
            User(firstName: "Jemima"),
            User(firstName: "Peter"),
            User(firstName: "David"),
            User(firstName: "Kelly"),
            User(firstName: "Isabella")
        ]
    
        users.sort {
            $0.firstName < $1.firstName
        }
    

    If you want to return a sorted array rather than sort it in place, use sorted() like this:

        let sortedUsers = users.sorted {
            $0.firstName < $1.firstName
        }
    
    0 讨论(0)
提交回复
热议问题