怎么对包含自定义对象的NSMutableArray排序

Compare method

Either you implement a compare-method for your object:

- (NSComparisonResult)compare:(Person *)otherObject {

    return [self.birthDate compare:otherObject.birthDate];

}



NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor (better)

or usually even better:

NSSortDescriptor *sortDescriptor;

sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"

                                              ascending:YES] autorelease];

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

You can easily sort by multiple keys by adding more than one to the array. Using custom comparator-methods is possible as well. Have a look at the documentation.

Blocks (shiny!)

There's also the possibility of sorting with a block since Mac OS X 10.6 and iOS 4:

NSArray *sortedArray;

sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {

    NSDate *first = [(Person*)a birthDate];

    NSDate *second = [(Person*)b birthDate];

    return [first compare:second];

}];


For this particular example I'm assuming that the objects in your array have a 'position' method, which returns an NSInteger.

NSArray *arrayToSort = where ever you get the array from... ;

NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) {

  if ([obj1 position] > [obj2 position]) { 

    return (NSComparisonResult)NSOrderedDescending;

  }

  if ([obj1 position] < [obj2 position]) {

    return (NSComparisonResult)NSOrderedAscending;

  }

  return (NSComparisonResult)NSOrderedSame;

};

NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];

Note: the "sorted" array will be autoreleased.

If this 'position' is in NSDictory.

NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) {

            NSInteger p1= [((NSString*) [obj1 objectForKey:@"position"]) integerValue];

            NSInteger p2= [((NSString*) [obj2 objectForKey:@"position"]) integerValue];

            if (p1 > p2) {

                return (NSComparisonResult)NSOrderedDescending;

            }

            if (p1 < p2) {

                return (NSComparisonResult)NSOrderedAscending;

            }

            return (NSComparisonResult)NSOrderedSame;

        };

你可能感兴趣的:(table)