通讯录(中级)

来源:互联网 发布:windows 活动目录 管理 编辑:程序博客网 时间:2024/05/04 13:05

实现中等难度通讯录。需求:
1、定义联系人类AddressContact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人信息


2、在main.m中定义字典,分组管理所有联系人。分组名为26个大写的英文字母。


3、可以添加联系人对象,如果姓名或电话号码为空,添加失败。添加联系人到匹配的分组。


4、获取某个分组名称下所有联系人,并且按照姓名升序排列。


5、从通讯录中根据电话号码搜索联系人。


6、获取所有女性的联系人,并且按照年龄的降序排列。


7、根据姓名删除某个联系人。


8、删除某个分组的全部联系人。

AddressContact.h

复制代码
#import <Foundation/Foundation.h>@interface AddressContact : NSObject{    NSString *_name; //姓名    NSString *_gender; //性别    NSString *_phoneNumber; //电话号码    NSInteger _age; //年龄}//setter and getter//_name  setter and getter- (void)setName:(NSString *)name;- (NSString *)name;//_gender  setter and getter- (void)setGender:(NSString *)gender;- (NSString *)gender;//_phoneNumber  setter and getter- (void)setPhoneNumber:(NSString *)phoneNumber;- (NSString *)phoneNumber;//_age  setter and getter- (void)setAge:(NSInteger)age;- (NSInteger)age;//init method- (id)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age;- (void)displayContactInfo;//告诉外界,该方法子类已经重写了.- (NSString *)description;//两个联系人对象比较的方法//按姓名- (NSComparisonResult)compareByName:(AddressContact *)addContact;//按年龄- (NSComparisonResult)compareByAge:(AddressContact *)addContact;//按联系方式- (NSComparisonResult)compareByPhoneNumber:(AddressContact *)addContact;@end
复制代码
复制代码

#import
"AddressContact.h"@implementation AddressContact//setter and getter//_name setter and getter- (void)setName:(NSString *)name{ _name = name;}- (NSString *)name{ return _name;}//_gender setter and getter- (void)setGender:(NSString *)gender{ _gender = gender;}- (NSString *)gender{ return _gender;}//_phoneNumber setter and getter- (void)setPhoneNumber:(NSString *)phoneNumber{ _phoneNumber = phoneNumber;}- (NSString *)phoneNumber{ return _phoneNumber;}//_age setter and getter- (void)setAge:(NSInteger)age{ _age = age;}- (NSInteger)age{ return _age;}//init method- (id)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(NSInteger)age{ self = [super init]; if (self) { _name = name; _gender = gender; _phoneNumber = phoneNumber; _age = age; } return self;}- (void)displayContactInfo{ NSLog(@"name:%@,gender:%@,phoneNumber:%@,age:%ld", _name, _gender, _phoneNumber, _age);}//重写从父类继承过来的description方法//当通过%@打印一个当前对象时,就会调用该方法.- (NSString *)description{// return [NSString stringWithFormat:@"<%@: %p>", [self class], self]; return [NSString stringWithFormat:@"name:%@,gender:%@,phoneNumber:%@,age:%ld", _name, _gender, _phoneNumber, _age];}//两个联系人对象比较的方法//按姓名- (NSComparisonResult)compareByName:(AddressContact *)addContact{ return [[self name] compare:[addContact name]];}//按年龄- (NSComparisonResult)compareByAge:(AddressContact *)addContact{ //1.获取年龄 NSInteger age1 = [self age]; NSInteger age2 = [addContact age]; //2.比较年龄// if (age1 > age2) {// return NSOrderedDescending;// } else if (age1 == age2) {// return NSOrderedSame;// } else {// return NSOrderedAscending;// } return -[@(age1) compare:@(age2)];}//按联系方式- (NSComparisonResult)compareByPhoneNumber:(AddressContact *)addContact{ return -[[self phoneNumber] compare:[addContact phoneNumber]];}@end
复制代码
AddressBook.h
复制代码
#import <Foundation/Foundation.h>@class AddressContact;@interface AddressBook : NSObject{    NSMutableDictionary *_allContactDic; //管理所有的分组}//获取所有的分组- (NSMutableDictionary *)allContactDic;//添加联系人- (BOOL)addAddressContact:(AddressContact *)addContact;//获得指定分组下得所有联系人,按照联系人姓名升序排序.- (NSMutableArray *)allContactsWithNameAscendingByGroupName:(NSString *)groupName;//获取所有女性的联系人,并且按照年龄的降序排列。- (NSMutableArray *)allGrilContactsWithAgeDecending;//从通讯录中根据电话号码搜索联系人。- (AddressContact *)getAddressContactByPhoneNumber:(NSString *)phoneNumber;//根据姓名删除某个联系人。- (void)removeAddressContactByName:(NSString *)name;//删除某个分组的全部联系人.- (void)removeAllContactsByGroupName:(NSString *)groupName;//输出所有学生的信息- (void)displayAllAddressContactInfo;@end
复制代码

 

复制代码
#import "AddressBook.h"#import "AddressContact.h"@implementation AddressBook//重写父类继承过来的初始化方法,在初始化的同时,为_allContactDic完成初始化操作.- (id)init{    self = [super init];    if (self) {        //通讯录        AddressContact *chaoQun = [[AddressContact alloc] initWithName:@"ChangChaoQun" gender:@"girl" phoneNumber:@"13838389438" age:18];        AddressContact *wangLi = [[AddressContact alloc] initWithName:@"WangLi" gender:@"man" phoneNumber:@"213213213" age:28];        AddressContact *chunPing = [[AddressContact alloc] initWithName:@"WangChunPing" gender:@"girl" phoneNumber:@"2132" age:20];                AddressContact *weiHai = [[AddressContact alloc] initWithName:@"WangWeiHai" gender:@"man" phoneNumber:@"111111" age:19];                AddressContact *yanYan = [[AddressContact alloc] initWithName:@"WangYanYan" gender:@"girl" phoneNumber:@"0000000" age:28];                AddressContact *mingXing = [[AddressContact alloc] initWithName:@"TanMingXing" gender:@"girl" phoneNumber:@"250250250" age:20];        AddressContact *qingCheng = [[AddressContact alloc] initWithName:@"ZhouQingCheng" gender:@"man" phoneNumber:@"110119120" age:18];                //创建分组,分别管理该组内的联系人        NSMutableArray *cGroupArr = [NSMutableArray arrayWithObject:chaoQun];        NSMutableArray *wGroupArr = [NSMutableArray arrayWithObjects:wangLi, chunPing, weiHai, yanYan, nil];        NSMutableArray *tGroupArr = [NSMutableArray arrayWithObject:mingXing];        NSMutableArray *zGroupArr = [NSMutableArray arrayWithObject:qingCheng];                //创建可变字典,管理班级的所有分组,每个分组管理该组内的联系人        _allContactDic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:cGroupArr, @"C", wGroupArr, @"W", tGroupArr, @"T", zGroupArr, @"Z", nil];    }    return self;}- (NSMutableDictionary *)allContactDic{    return _allContactDic;}//添加联系人- (BOOL)addAddressContact:(AddressContact *)addContact{    //1.判断姓名以及联系方式是否为空    NSString *name = [addContact name];    NSString *phoneNumber = [addContact phoneNumber];    if (!name || ![name length] || !phoneNumber || ![phoneNumber length]) {        return NO;    } else {        //添加到对应的分组中        //(1)获取到姓名首字母        NSString *firstCharac = [name substringToIndex:1];        //(2)根据key 从字典中取出对应的分组        NSMutableArray *groupArr = _allContactDic[firstCharac];        //(3)判断是否成功从字典中取到key对应的数组        if (!groupArr) {            //如果没有数组,就创建数组.            groupArr = [NSMutableArray arrayWithCapacity:1];            //将key以及value添加到字典中            [_allContactDic setObject:groupArr forKey:firstCharac];        }        [groupArr addObject:addContact];        return YES;    }}//获得指定分组下得所有联系人,按照联系人姓名升序排序.- (NSMutableArray *)allContactsWithNameAscendingByGroupName:(NSString *)groupName{    //key 对应的数组就存储着该组下所有的联系人.    NSMutableArray *wGroup = _allContactDic[groupName];    //按照联系人姓名升序排序.    [wGroup sortUsingSelector:@selector(compareByName:)];    return wGroup;}//获取所有女性的联系人,并且按照年龄的降序排列。- (NSMutableArray *)allGrilContactsWithAgeDecending{    //获取所有女性的联系人,并且按照年龄的降序排列。    NSMutableArray *girlArr = [[NSMutableArray alloc] initWithCapacity:1];    for (NSString *key in _allContactDic) {        NSMutableArray *groupArr = _allContactDic[key];        for (AddressContact *contact in groupArr) {            if ([[contact gender] isEqualToString:@"girl"]) {                //查找到女性联系人之后,将联系人添加到女性数组中.                [girlArr addObject:contact];            }        }    }    //按照年龄降序排列    [girlArr sortUsingSelector:@selector(compareByAge:)];    return girlArr;}//从通讯录中根据电话号码搜索联系人。- (AddressContact *)getAddressContactByPhoneNumber:(NSString *)phoneNumber{    //1.先获取联系人所在的数组    for (NSString *key in _allContactDic) {        //根据key获取对应的数组.        NSMutableArray *groupArr = _allContactDic[key];        //遍历到数组中的联系人        for (AddressContact *contact in groupArr) {            if ([[contact phoneNumber] isEqualToString:phoneNumber]) {                return contact;            }        }    }    return nil;}//根据姓名删除某个联系人。- (void)removeAddressContactByName:(NSString *)name{    //(1)获取所在分组名称    NSString *groupName = [name substringToIndex:1];    //(2)获取key -- 数组    NSMutableArray *group = _allContactDic[groupName];    for (int i = 0; i < [group count]; i++) {        AddressContact *contact = group[i];        if ([[contact name] isEqualToString:@"ChangChaoQun"]) {            //如果和指定名字相同,则从数组中移除对应的元素.            [group removeObjectAtIndex:i];            break;        }    }}//删除某个分组的全部联系人.- (void)removeAllContactsByGroupName:(NSString *)groupName{    [_allContactDic removeObjectForKey:groupName];}//输出所有学生的信息- (void)displayAllAddressContactInfo{    NSLog(@"allContactInfo = %@", _allContactDic);}@end
复制代码

 

main.m

复制代码
#import <Foundation/Foundation.h>#import "AddressBook.h"#import "AddressContact.h"int main(int argc, const char * argv[]){    @autoreleasepool {        //创建通讯录对象        AddressBook *lanou12 = [[AddressBook alloc] init];        //添加联系人        AddressContact *frank = [[AddressContact alloc] initWithName:@"Frank" gender:@"man" phoneNumber:@"18612697721" age:16];        BOOL isSuccess = [lanou12 addAddressContact:frank];        NSLog(@"%d", isSuccess);        [lanou12 displayAllAddressContactInfo];        //获得指定分组下得所有联系人,按照联系人姓名升序排序.        NSMutableArray *wGroupArr = [lanou12 allContactsWithNameAscendingByGroupName:@"W"];        NSLog(@"%@", wGroupArr);        //获取所有女性的联系人,并且按照年龄的降序排列。        NSMutableArray *girlArr = [lanou12 allGrilContactsWithAgeDecending];        NSLog(@"%@", girlArr);        //从通讯录中根据电话号码搜索联系人。        AddressContact *contact = [lanou12 getAddressContactByPhoneNumber:@"13838389438"];        NSLog(@"contact = %@", contact);        //删除姓名为ChangChaoQun的联系人        [lanou12 removeAddressContactByName:@"ChangChaoQun"];        [lanou12 displayAllAddressContactInfo];        //删除W分组下得所有联系人        [lanou12 removeAllContactsByGroupName:@"F"];        [lanou12 displayAllAddressContactInfo];    }    return 0;}
0 0