中级通讯录

实现中等难度通讯录。需求:
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;
}

 

posted @ 2014-12-31 10:56  Every-Day  阅读(551)  评论(0编辑  收藏  举报