(注:使用MRC)
一、功能描述:
main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能:
1).使用便利构造器创建四个Person类的实例(联系人).
姓名:Lucy 性别:女 电话:123 年龄:21
姓名:Joe 性别:男 电话:456 年龄:17
姓名:Baby 性别:女 电话:789 年龄:27
姓名:Linda 性别:女 电话:000 年龄:21
2).创建一个AddressBook类的实例对象(通讯录).
3).使用AddressBook类中定义的方法实现:添加联系人,将四个联系人添加到通讯录中.
4).使用AddressBook类中定义的方法实现:根据电话查找联系人,并打印(查找电话:456);
5).使用AddressBook类中定义的方法实现:根据性别查找联系人,并将查到的联系人按照年龄升序排序,并打印(查找性别:女)
6).使用AddressBook类中定义的方法实现:根据姓名,更改联系人信息.(修改Linda的信息: 性别:女 电话:012 年龄:25);
7).使用AddressBook类中定义的方法实现:按照姓名删除联系人,并展示通信录中所有人信息.(删除联系人:Baby)
8).使用AddressBook类中定义的方法实现:删除一个分组,并展示通信录中所有人信息.(删除L组)
9).使用AddressBook类中定义的方法实现:实现3~8之间每个功能后,输出通讯录中所有联系人信息。
二、功能实现提示:
1、功能一
定义Person类
1)声明属性:姓名,年龄,性别,电话,分组。注:年龄是int类型,其余属性时NSString类型;分组是姓名首字母(大写),使用提供的类目:NSString+Characters中的方法获取。(3分)
2)重写description方法,输出Person对象的信息。例如: “姓名:张三 性别:男 年龄:22 电话:123456789”.(2分)
3)定义Person类的便利构造器方法,方法包含参数:姓名、年龄、性别、电话.(5分)
2、功能二
定义AddressBook类.
1)声明属性:allPersonDic(字典类型)。使用声明的字典作为容器,分组管理通讯录中所有联系人;字典的Key值为分组名(姓名首字母,大写),value值为数组,数组中存放联系人(Person实例).(5分)
2)在AddressBook的初始化方法中,初始化allPersonDic。(5分)
3)重写dealloc方法,在dealloc方法中实现AddressBook类的内存管理。(5分)
3、功能三
添加联系人.要求(15分)
a.在AddressBook类中定义方法:
- (BOOL)addPerson:(Person *)aPerson;
b.判断姓名和电话不能为空否则添加失败.
c.判断是否已经存在分组,存在直接存储.不存在创建分组后再存储.(注:联系人不能有重名).
d.添加成功返回YES,姓名为空或者有重名的添加失败返回NO.
e.数据使用Person存储.
4、功能四
根据电话查找某个联系人.(10分)
a:在AddressBook类中定义方法:
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
b:如果找到返回该联系人,否则返回nil.
c.忽略电话重复问题,只返回第一个查找到的联系人。
5、功能五
根据性别查找联系人,并将查到的联系人按照年龄升序排序(15分)
a:在AddressBook类中定义方法:
-(NSArray *)findPersonsWithSex:(NSString *)aSex;
b:查找到联系人放入数组,排序的时候使用block.
6、功能六
根据姓名,更改联系人信息.(10分)
a:在AddressBook类中定义方法:
-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;
b:找到该联系人并修改该成功返回YES,否则返回NO
c.修改电话、性别、年龄,参数不能为空。
7、功能七
按照姓名删除联系人.(15分)
a.在AddressBook类中定义方法:
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
b.删除成功返回YES,否则返回NO;
c.当删除联系人后分组为空时,需要删除该分组。
8、功能八
删除一个分组.(5分)
a.在AddressBook类中定义方法:
- (BOOL)deleteGroup:(NSString *)aGroupName;
b.删除成功返回YES,否则返回NO;
9、功能九
展示通讯录中的所有联系人信息(5分)
a:在AddressBook类中定义方法:
-(void)showAll;
b.通过重写description方法展示联系人信息 。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject //声明属性 @property (nonatomic , retain) NSString *name; @property (nonatomic , retain)NSString *gender; @property (nonatomic , assign)int age; @property (nonatomic , retain) NSString *phoneNumber; @property (nonatomic , retain)NSString *groupName; //声明初始化方法 - (id)initWithPersonName:(NSString *)name age:(int)age gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber groupName:(NSString *)groupName; //便利构造器 + (id)personWithName:(NSString *)name age:(int)age gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber groupName:(NSString *)groupName; @end
Person.m
#import "Person.h" @implementation Person - (id)initWithPersonName:(NSString *)name age:(int)age gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber groupName:(NSString *)groupName{ if (self = [super init]) { self.name = name; self.age = age; self.phoneNumber = phoneNumber; self.gender = gender; self.groupName = groupName; } return self; } + (id)personWithName:(NSString *)name age:(int)age gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber groupName:(NSString *)groupName{ Person *person = [[[Person alloc]initWithPersonName:name age:age gender:gender phoneNumber:phoneNumber groupName:groupName] autorelease]; return person; } //重写父类的方法,默认情况是打印对象的地址。 - (NSString *)description{ return [NSString stringWithFormat:@" 姓名:%@ ,性别:%@ , 年龄:%d , 电话:%@ , 分组名:%@ ", _name , _gender , _age, _phoneNumber , _groupName ]; } - (void)dealloc{ NSLog(@"%s" , __FUNCTION__); [_name release]; [_gender release]; [_phoneNumber release]; [_groupName release]; [super dealloc]; } @end
AddressBook.h
#import <Foundation/Foundation.h> #import "Person.h" @interface AddressBook : NSObject //声明一个字典,用来存储联系人 @property (nonatomic , retain) NSMutableDictionary *allPersonDic; //初始化方法 - (id)initWithMutableDic:(NSMutableDictionary *)dic; //声明方法,添加联系人 - (BOOL)addPerson:(Person *)aPerson; //按照电话查找某个联系人 - (Person *)findPersonWithPhoneNumber:(NSString *)aPhoneNumber; //按性别查找,并且排序 - (NSArray *)findPersonWithSex:(NSString *)sex; //根据姓名,来修改联系人的信息 - (BOOL)changePersonWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber sex:(NSString *)sex age:(int)age; //删除联系人 - (BOOL)deletePersonWithName:(NSString *)name; //删除分组 - (BOOL)deleteGroupName:(NSString *)aGroupname; //打印所有的人 - (void)showAll; @end
AddressBook.m
#import "AddressBook.h" #import "NSString+Character.h" @implementation AddressBook - (id)initWithMutableDic:(NSMutableDictionary *)dic{ if (self = [super init]) { _allPersonDic = dic; } return self; } - (void)dealloc{ [_allPersonDic release]; [super dealloc]; } //实现添加联系人的方法 - (BOOL)addPerson:(Person *)aPerson{ //第一步,先判断名字和电话 if ((aPerson.name == nil || aPerson.phoneNumber == nil ) || ([aPerson.name isEqualToString:@""] || [aPerson.phoneNumber isEqualToString:@""])) { NSLog(@"信息不完整,添加失败"); return NO; } //获取名字的首字母,并且大写。当作字典的key(键) NSString *keyStr = [aPerson.name uppercaseFirstLetter]; //通过键来查找数组 NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr]; if (! tempArray) { //给数组分配空间 tempArray = [[NSMutableArray alloc]init]; //创建键值对 [_allPersonDic setObject:tempArray forKey:keyStr]; } //检查一下是否有重名的 for (int i = 0; i < [tempArray count]; i ++) { if ([aPerson.name isEqualToString:[tempArray[i] name]]) { NSLog(@"有重名的,添加失败"); return NO; } } //把联系人加进创建好的数组里面 [tempArray addObject:aPerson]; return YES; } //实现按照号码找人的方法 - (Person *)findPersonWithPhoneNumber:(NSString *)aPhoneNumber{ //第一步,把字典里面的键拿出来,通过键来取值 for (NSString *keyStr in _allPersonDic) { //通过objectForKey: 这个方法,把字典里面的数组拿出来 NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr]; //遍历拿出来的数组,让数组里面每一个人的号码,和 形参的值进行比较。 for (Person *p in tempArray) { if ([p.phoneNumber isEqualToString:aPhoneNumber]) { NSLog(@"人找到了"); return p; } } } NSLog(@"没有找到该联系人"); return nil; } //实现方法 - (NSArray *)findPersonWithSex:(NSString *)sex{ //声明数组,用来储存性别相同的人 NSMutableArray *mutableArray = [[NSMutableArray alloc]init]; //然后再开始,遍历字典,拿到键值,遍历数组 for (NSString *keyStr in _allPersonDic) { NSMutableArray *array = [_allPersonDic objectForKey:keyStr]; for (Person *person in array) { //跟上一方法不同的地方 if ([person.gender isEqualToString:sex]) { [mutableArray addObject:person]; } } } [mutableArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Person *per1 = (Person *)obj1; Person *per2 = (Person *)obj2; if ( per1.age > per2.age ) { return NSOrderedDescending; } else if (per1.age < per2.age){ return NSOrderedAscending; } return NSOrderedSame; }]; // [mutableArray sortUsingSelector:@selector(compare:)]; return mutableArray; } //实现修改方法 - (BOOL)changePersonWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber sex:(NSString *)sex age:(int)age{ //第一步,先遍历 for (NSString *keyStr in _allPersonDic) { //通过key来取值 NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr]; //开始遍历数组 for (Person *person in tempArray) { if ([person.name isEqualToString:name]) { //找到人后,开始修改,把传进来的新的信息赋值给这个人 person.phoneNumber = phoneNumber; person.gender = sex; person.age = age; NSLog(@"赋值成功"); return YES; } } } return NO; } - (BOOL)deletePersonWithName:(NSString *)name{ for (NSString *keyStr in _allPersonDic) { NSMutableArray *tempArray = [_allPersonDic objectForKey:keyStr]; //遍历数组 for (Person *person in tempArray) { if ([person.name isEqualToString:name]) { [tempArray removeObject:person]; NSLog(@"找到要删除的人了"); //如果这个人,是分组里面最后一个,就把分组也删除 if ([tempArray count] == 0) { //在字典里面删除键值对 [_allPersonDic removeObjectForKey:keyStr]; NSLog(@"数组已经被删除"); } return YES; } } } NSLog(@"没有找到"); return NO; } //实现删除分组的方法 - (BOOL)deleteGroupName:(NSString *)aGroupname{ //先判断,有么有这个分组 for (NSString *keyStr in _allPersonDic) { if ([keyStr isEqualToString:aGroupname]) { //先通过传进来的键,来获取字典里面的值(数组) NSMutableArray *tempArray = [_allPersonDic objectForKey:aGroupname]; //删完这个数组里面的所有元素 [tempArray removeAllObjects]; //删除字典里面的键值对,通过键来删除 [_allPersonDic removeObjectForKey:aGroupname]; NSLog(@"找到分组,删除成功"); return YES; } } NSLog(@"没有这个分组"); return NO; } //打印所有人 - (void)showAll{ for (NSString *key in _allPersonDic) { NSMutableArray *array = [_allPersonDic objectForKey:key]; for (Person *person in array) { NSLog(@"%@" , person); } } } @end
NSString+Character.h
#import <Foundation/Foundation.h> @interface NSString (Character) - (NSString *)uppercaseFirstLetter; @end
NSString+Character.m
@implementation NSString (Character) - (NSString *)uppercaseFirstLetter{ return [[self uppercaseString] substringToIndex:1]; } @end
main.m
#import <Foundation/Foundation.h> #import "Person.h" #import "AddressBook.h" int main(int argc, const char * argv[]) { // 创建三个对象,就是三个人啊 Person *person = [[Person alloc]initWithPersonName:@"Auroua" age:21 gender:@"girl" phoneNumber:@"1352345678" groupName:@"friend"]; NSLog(@"%@" , person); Person *person1 = [[Person alloc]initWithPersonName:@"Lily" age:18 gender:@"girl" phoneNumber:@"18638520107" groupName:@"firend"]; Person *person4 = [[Person alloc]initWithPersonName:@"DaShi" age:18 gender:@"boy" phoneNumber:@"110" groupName:@"fff"]; //声明完容器类之后,一定给它开辟空间。 AddressBook *addressBook = [[AddressBook alloc]initWithMutableDic:[NSMutableDictionary dictionary]]; //判断person对象是否加进字典里面 BOOL result = [addressBook addPerson:person]; NSLog(@"result = %@" , result ? @"YES" : @"NO" ); //判断person1对象是否加进字典里面 BOOL result1 = [addressBook addPerson:person1]; NSLog(@"result1 =%@" , result1 ? @"YES" : @"NO" ); //判断person11对象是否加进字典里面 BOOL result11 = [addressBook addPerson:person4]; NSLog(@"result11 =%@" , result11 ? @"YES" : @"NO" ); //查找联系人 Person *tempPerson = [addressBook findPersonWithPhoneNumber:@"18638520107"]; NSLog(@"%@" , tempPerson); //接收排序结束后的数组 NSArray *array = [addressBook findPersonWithSex:@"girl"]; NSLog(@"排序后的结果"); for (Person *per in array) { NSLog(@"%@" , per); } //改变联系人信息,判断是否改变成功 BOOL result2 = [addressBook changePersonWithName:@"Lily" phoneNumber:@"123" sex:@"boy" age:40]; NSLog(@"%@" , result2 ? @"YES" : @"NO"); //按名字删除一个联系人,删除了Lily BOOL result3 = [addressBook deletePersonWithName:@"Lily"]; NSLog(@"%@" , result3 ? @"YES" : @"NO"); //刚刚删除了Lily,现在把Lily加进来 [addressBook addPerson:person1]; //删除某一个分组 BOOL result5 = [addressBook deleteGroupName:@"D"]; NSLog(@"%@" , result5 ? @"YES" : @"NO"); //展示分组里面的所有的信息 [addressBook showAll]; return 0; }