新建person类,设定属性,并写协议和实现协议的时机
person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic, copy)NSString *name;
@property(nonatomic, copy)NSString *gender;
@property(nonatomic, copy)NSString *phoneNumber;
@property(nonatomic)NSInteger age;
//初始化方法
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age;
//便利构造器
+ (Person *)personWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age;
@end
#import "Person.h"
@implementation Person
//初始化方法
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age{
self = [super init];
if (self) {
self.name = name;
self.gender = gender;
self.phoneNumber = phoneNumber;
self.age = age;
}
return self;
}
//便利构造器
+ (Person *)personWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age{
return [[[Person alloc] initWithName:name gender:gender phoneNumber:phoneNumber age:age] autorelease];
}
//MRC下释放
- (void)dealloc{
[_name release];
[_gender release];
[_phoneNumber release];
[super dealloc];
}
//重写description
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@ %@ %lu", self.name, self.gender, self.phoneNumber, self.age];
}
@end
#import <Foundation/Foundation.h>
@class Person;
@interface AddressBook : NSObject
//添加联系人,添加成功返回YES,否则返回NO
- (BOOL)addPerson:(Person *)aPerson;
//输出所有联系人信息
- (void)outPutAllContactInfo;
//根据电话查找联系人,并打印
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
//查找所有女性联系人并按年龄降序排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex;
//根据姓名更改联系人信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;
//按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
//删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName;
@end
AddressBook.m
#import "AddressBook.h"
#import "Person.h"
//延展
@interface AddressBook ()
//容器,用来存放所有联系人
@property(nonatomic , retain)NSMutableDictionary *allPersonDic;
//获取名字的首字母
- (NSString *)getFirstCharByName:(Person *)person;
@end
/
@implementation AddressBook
//重写init,在addressbook创建时,就将allPersonDic创建出来
- (instancetype)init{
if (self = [super init]) {
self.allPersonDic = [NSMutableDictionary dictionary];
}
return self;
}
//MRC下手动释放
- (void)dealloc{
[_allPersonDic release];
[super dealloc];
}
//获取名字的首字母
- (NSString *)getFirstCharByName:(Person *)person{
return [person.name substringToIndex:1];
}
//
//输出所有联系人信息
- (void)outPutAllContactInfo{
NSLog(@"%@", self.allPersonDic);
}
//
//添加联系人,添加成功返回YES,否则返回NO
- (BOOL)addPerson:(Person *)aPerson{
//判断姓名和电话不能为空否则添加失败
if (aPerson.name.length ==0 || aPerson.phoneNumber.length == 0) {
NSLog(@"添加失败");
return NO;
}
//获取联系人首字母
NSString *keyStr = [self getFirstCharByName:aPerson];
//判断是否已存在分组,没有创建后添加联系人,有了直接添加联系人
NSMutableArray *groupArr = self.allPersonDic[keyStr];
if (groupArr == nil) {
//新建一个分组
NSMutableArray *newGroup = [@[] mutableCopy];
//将联系人放到分组内
[newGroup addObject:aPerson];
//将分组放到通讯录中
[self.allPersonDic setObject:newGroup forKey:keyStr];
}else{
//如果已经存在分组,直接添加联系人
[groupArr addObject:aPerson];
}
return YES;
}
//根据电话查找联系人,并打印
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum{
for (NSString *key in self.allPersonDic) {
for (Person *p in self.allPersonDic[key]) {
if ([p.phoneNumber isEqualToString:aPhoneNum]) {
return p;
}
}
}
return nil;
}
//查找所有女性联系人并按年龄降序排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex{
//新建一个女性数组
NSMutableArray *womanArr = [@[] mutableCopy];
//遍历获得所有女性联系人
for (NSString *key in self.allPersonDic) {
for (Person *p in self.allPersonDic[key]) {
if ([p.gender isEqualToString:@"w"]) {
//如果是女性,放入女性数组内
[womanArr addObject:p];
}
}
}
//升序排序
NSSortDescriptor *des = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];
[des release];
return womanArr;
}
///
//根据姓名更改联系人信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge{
//因为要修改,我们先拷贝字典
NSMutableDictionary *copyDic = [self.allPersonDic mutableCopy];
for (NSString *key in copyDic) {
//拷贝数组
for (Person *p in self.allPersonDic[key]) {
if ([p.name isEqualToString:name]) {
//如果找到联系人就修改
[self.allPersonDic[key] removeObject:p];
Person *p1 = [Person personWithName:name gender:aSex phoneNumber:aNum age:aAge];
[self.allPersonDic[key] addObject:p1];
return YES;
}
}
}
return NO;
}
/
//按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName{
//因为要修改,我们先拷贝字典
NSMutableDictionary *copyDic = [self.allPersonDic mutableCopy];
for (NSString *key in copyDic) {
//拷贝数组
for (Person *p in self.allPersonDic[key]) {
if ([p.name isEqualToString:aPersonName]) {
//如果找到联系人就删除
[self.allPersonDic[key] removeObject:p];
//每次删除完进行判断该分组内是否还有对象,如果没有,删除分组
if ([self.allPersonDic[key] count] == 0) {
[self.allPersonDic removeObjectForKey:key];
return YES;
}
}
}
}
return NO;
}
/
//删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName{
//因为要修改,我们先拷贝字典
NSMutableDictionary *copyDic = [self.allPersonDic mutableCopy];
for (NSString *key in copyDic) {
//如果找到就删除
if ([key isEqualToString:aGroupName]) {
[self.allPersonDic removeObjectForKey:key];
}
return YES;
}
return NO;
}
@end
协议写好之后,main函数中可以调用这些方法,形成模拟通讯录(OC)
#import <Foundation/Foundation.h>
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.
Person *p1 = [Person personWithName:@"Lucy" gender:@"w" phoneNumber:@"123" age:21];
Person *p2 = [Person personWithName:@"Joe" gender:@"m" phoneNumber:@"456" age:17];
Person *p3 = [Person personWithName:@"Baby" gender:@"w" phoneNumber:@"789" age:27];
Person *p4 = [Person personWithName:@"Linda" gender:@"w" phoneNumber:@"000" age:21];
//2.
AddressBook *manager = [[AddressBook alloc] init];
//3.
[manager addPerson:p1];
[manager addPerson:p2];
[manager addPerson:p3];
[manager addPerson:p4];
[manager outPutAllContactInfo];
//4.根据电话查找联系人,并打印
NSLog(@"%@", [manager findPersonWithPhoneNum:@"456"]);
//5.根据性别查找联系人,并按年龄升序排序,并打印
NSLog(@"%@", [manager findPersonsWithSex:@"w"]);
//6.根据姓名更改联系人信息
[manager changePersonWithName:@"Linda" phoneNum:@"012" sex:@"w" age:25];
[manager outPutAllContactInfo];
//7.按照姓名删除联系人,并展示所有联系人
[manager deletePersonWithName:@"Baby"];
[manager outPutAllContactInfo];
//8.删除一个分组,并展示通讯录中所有联系人
[manager deleteGroup:@"L"];
[manager outPutAllContactInfo];
//9.展示所有联系人信息(outPutAllContactInfo方法代表的就是题目中要求的showAll方法)
[manager outPutAllContactInfo];
}
return 0;
}