標籤:sort nsmutablearray nsarray
OC中類方法中只為我們提供了一些降序方法,現在我們自己定義方法,實現升序.
1.要求:定義一個Person類,執行個體變數包括name,age,height,定義幾個對象,把這些對象儲存在數組中,自己定義方法,實現數組按name,age,gheight的升序排列輸出.
首先Person.h檔案
#import <Foundation/Foundation.h>@interface Person : NSObject{ NSString *_name;//姓名 NSInteger _age;//年齡 CGFloat _height;//身高}//初始化- (id)initWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height;//姓名- (void)setName:(NSString *)name;- (NSString *)name;//年齡- (void)setAge:(NSInteger)age;- (NSInteger)age;//身高- (void)setHeight:(CGFloat)height;- (CGFloat)height;//比較age- (NSComparisonResult)compareByAge:(Person *)anPerson;//比較身高- (NSComparisonResult)compareByHeight:(Person *)anPerson;//比較名字升序- (NSComparisonResult)compareByName:(Person *)anPerson;//名字降序- (NSComparisonResult)compareByNameDesceding:(Person *)anPerson;
Person.m檔案
#import "Person.h"@implementation Person#pragma mark - setter and getter//set姓名- (void)setName:(NSString *)name{ _name = name;}- (NSString *)name{ return _name;}//set年齡- (void)setAge:(NSInteger)age{ _age = age;}- (NSInteger)age{ return _age;}//set身高- (void)setHeight:(CGFloat)height{ _height = height;}- (CGFloat)height{ return _height;}#pragma mark - init method//初始化- (id)initWithName:(NSString *)name age:(NSInteger)age height:(CGFloat)height{ self = [super init]; if (self != nil) { _name = name; _age = age; _height = height; } return self;}#pragma mark - override method//重寫description- (NSString *)description{ return [NSString stringWithFormat:@"name:%@ age:%ld, height:%g", _name, _age, _height];}#pragma mark - compare//比較年齡age- (NSComparisonResult)compareByAge:(Person *)anPerson{ if ([self age] > [anPerson age]) { return NSOrderedDescending;//1 降序 }else if([self age] == [anPerson age]){ //相等 return NSOrderedSame;//0 }else{ return NSOrderedAscending;//-1 升序 }}//比較身高- (NSComparisonResult)compareByHeight:(Person *)anPerson{ if ([self height] > [anPerson height]) { return NSOrderedDescending; }else if([self height] == [anPerson height]){ return NSOrderedSame; }else{ return NSOrderedAscending; }}//比較名字- (NSComparisonResult)compareByName:(Person *)anPerson{ return [[self name] compare:[anPerson name]];}//名字降序- (NSComparisonResult)compareByNameDesceding:(Person *)anPerson{ return -[[self name] compare:[anPerson name]];}@end
主函數中main.m調用
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]){ @autoreleasepool { Person *per1 = [[Person alloc] initWithName:@"xiaoshuai" age:12 height:178]; Person *per2 = [[Person alloc] initWithName:@"xiaomeng" age:22 height:175]; Person *per3 = [[Person alloc] initWithName:@"xiaoguangguang" age:20 height:180]; Person *per4 = [[Person alloc] initWithName:@"dapeng" age:30 height:190]; NSArray *perArr = [[NSArray alloc] initWithObjects:per1,per2,per3,per4, nil]; //對數組按姓名升序排序 NSArray *sortArrName = [perArr sortedArrayUsingSelector:@selector(compareByName:)]; NSLog(@"%@", sortArrName); //對數組中年齡升序排序 NSArray *sortArrAge = [perArr sortedArrayUsingSelector:@selector(compareByAge:)]; NSLog(@"%@", sortArrAge); //對數組中身高按升序排序 NSArray *sortArrHeight = [perArr sortedArrayUsingSelector:@selector(compareByHeight:)]; NSLog(@"%@", sortArrHeight); //名字降序 NSArray *sortArrNameDescending = [perArr sortedArrayUsingSelector:@selector(compareByNameDesceding:)]; NSLog(@"%@", sortArrNameDescending); } return 0;}
測試結果:
2014-08-14 22:03:37.650 Lesson_Sort[4908:303] (
"name:dapeng age:30, height:190",
"name:xiaoguangguang age:20, height:180",
"name:xiaomeng age:22, height:175",
"name:xiaoshuai age:12, height:178"
)
2014-08-14 22:03:37.651 Lesson_Sort[4908:303] (
"name:xiaoshuai age:12, height:178",
"name:xiaoguangguang age:20, height:180",
"name:xiaomeng age:22, height:175",
"name:dapeng age:30, height:190"
)
2014-08-14 22:03:37.652 Lesson_Sort[4908:303] (
"name:xiaomeng age:22, height:175",
"name:xiaoshuai age:12, height:178",
"name:xiaoguangguang age:20, height:180",
"name:dapeng age:30, height:190"
)
2014-08-14 22:03:37.652 Lesson_Sort[4908:303] (
"name:xiaoshuai age:12, height:178",
"name:xiaomeng age:22, height:175",
"name:xiaoguangguang age:20, height:180",
"name:dapeng age:30, height:190"
)