OC通讯录(MRC手动管理内存)

//  ****** 获取姓名首字母 ********

//  ****** NSString+Characters.h文件

#import

@interface NSString (Characters)

- (NSString *)charactersGroupName;

@end

//  ********NSString+Characters.m文件

#import "NSString+Characters.h"

@implementation NSString (Characters)

- (NSString *)charactersGroupName

{

    NSString *string = [self uppercaseString];

    return [string substringToIndex:1];

}

@end

//  ****** 创建一个Person类 ******

//  ****** Person.h文件

#import

@interface Person : NSObject

@property(nonatomic, retain)NSString *name;

@property(nonatomic, assign)int age;

@property(nonatomic, retain)NSString *sex;

@property(nonatomic, retain)NSString *num;

@property(nonatomic, retain)NSString *groupName;

- (instancetype)initWithName:(NSString *)name //  重写初始化

               Age:(int)age

               Sex:(NSString *)sex

               Num:(NSString *)num;

+ (instancetype)personWithName:(NSString *)name //  便利构造器

                 Age:(int)age

                 Sex:(NSString *)sex

                 Num:(NSString *)num;

- (void)description; //  重写description方法

@end


//  ****** Person.m文件

#import "Person.h"

#import "NSString+Characters.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name

                         Age:(int)age

                         Sex:(NSString *)sex

                         Num:(NSString *)num

{

    _name = name;

    _age = age;

    _sex = sex;

    _num = num;

    _groupName = [name charactersGroupName]; // 通过姓名得到组名

    return self;

}

+ (instancetype)personWithName:(NSString *)name

                           Age:(int)age

                           Sex:(NSString *)sex

                           Num:(NSString *)num

{

    Person *p = [[[Person alloc] initWithName:name Age:age Sex:sex Num:num] autorelease];

    return p;

}

- (void)description

{

    NSLog(@"姓名:%@ 年龄:%d 性别:%@ 号码:%@ 分组:%@",self.name,self.age,self.sex,self.num,self.groupName);

}

- (void)dealloc //  重写dealloc方法

{

    [_name release];

    [_sex release];

    [_num release];

    [_groupName release];

    [super dealloc];

}

@end

//  ****** 通讯录功能实现 ******

//  ****** AddressBook.h文件

#import

@class Person;

@interface AddressBook : NSObject

@property(nonatomic, retain)NSMutableDictionary *allPersonDic;

- (instancetype)init;

+ (instancetype)addressBook;

// 3.)添加联系人

- (BOOL)addPerson:(Person *)aPerson;

// 4.)根据号码查找联系人

- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;

// 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序

- (NSArray *)findPersonsWithSex:(NSString *)aSex;

// 6.)根据姓名,更改联系人信息

- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(int) aAge;

// 7.)按照姓名删除联系人

- (BOOL)deletePersonWithName:(NSString*)aPersonName;

// 8.)删除一个分组

- (BOOL)deleteGroup:(NSString *)aGroupName;

// 9.)展示通讯录中的所有联系人信息

- (void)showAll;

@end

//  ******  AddressBook.m文件

#import "AddressBook.h"

#import "Person.h"

#import "NSString+Characters.h"

@implementation AddressBook

- (instancetype)init

{

    self = [super init];

    if (self) {

        self.allPersonDic = [NSMutableDictionary dictionary];

    }

    return self;

}

+ (instancetype)addressBook

{

    AddressBook *add = [[[AddressBook alloc] init] autorelease];

    return add;

}

- (void)dealloc

{

    [_allPersonDic release];

    [super dealloc];

}

// 3.)添加联系人

- (BOOL)addPerson:(Person *)aPerson

{

    // 判断姓名、电话是否为空,分组是否存在

    BOOL isNameNil = aPerson.name == nil;

    BOOL isNumNil = aPerson.num == nil;

    BOOL isGroupExist = [[_allPersonDic allKeys] containsObject:aPerson.groupName];

    // 当姓名、电话不为空,分组存在时

    if (!isNameNil && !isNumNil && isGroupExist) {

        // 遍历字典,找到对应的组

        for (NSString *key in _allPersonDic) {

            NSMutableArray *array = _allPersonDic[key];

            if ([key isEqualToString:aPerson.groupName]) {

                // 遍历组,判断是否重名

                for (Person *p in array) {

                    if (p.name == aPerson.name) {

                        NSLog(@"此联系人已存在,添加失败!!!");

                        return NO;

                    }

                }

                // 遍历之外添加联系人

                NSLog(@"添加成功");

                [array addObject:aPerson];

                return YES;

            }

        }

    }else if (!isNameNil && !isNumNil) { // 当分组不存在时,创建分组

        [_allPersonDic setValue:[NSMutableArray arrayWithObject:aPerson] forKey:aPerson.groupName];

        NSLog(@"添加成功");

        return YES;

    }else {

        NSLog(@"添加失败!!!姓名或号码不能为空!!!");

        return NO;

    }

    return NO;

}


// 4.)根据号码查找联系人

- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum

{

    Person *per = nil;

    for (NSArray *array in [_allPersonDic allValues]) {

        for (Person *p in array) {

            if (p.num == aPhoneNum) {

                per = p;

                return per;

            }

        }

    }

    NSLog(@"没有该联系人");

    return per;

}

// 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序

- (NSArray *)findPersonsWithSex:(NSString *)aSex

{

    NSMutableArray *nma = [NSMutableArray array];

    for (NSArray *array in [_allPersonDic allValues]) {

        for (Person *p in array) {

            if (p.sex == aSex) {

                [nma addObject:p];

            }

        }

    }

    NSComparator comSex  = ^(Person *p1, Person *p2){

        if (p1.age > p2.age) {return NSOrderedDescending;}

        else if(p1.age < p2.age){return NSOrderedAscending;}

        else {return NSOrderedSame;}

    };

    NSArray *arr = [nma sortedArrayUsingComparator:comSex];

    return arr;

}

// 6.)根据姓名,更改联系人信息

- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(int) aAge

{

    // 根据姓名找到联系人

    for (NSArray *arr in [_allPersonDic allValues]) {

        for (Person *p in arr) {

            if ([p.name isEqualToString:name]) {

                [p setName:name];

                [p setNum:aNum];

                [p setSex:aSex];

                [p setAge:aAge];

                [p setGroupName:[name charactersGroupName]];

                NSLog(@"修改成功");

                return YES;

            }

        }

    }

    NSLog(@"修改失败,没有此联系人");

    return NO;

}

// 7.)按照姓名删除联系人

- (BOOL)deletePersonWithName:(NSString*)aPersonName

{

    for (NSMutableArray *arr in [_allPersonDic allValues]) {

        for (Person *p in arr) {

            if ([p.name isEqualToString:aPersonName]) {

                [arr removeObject:p];

                NSLog(@"删除成功");

                return YES;

            }

        }

    }

    NSLog(@"删除失败");

    return NO;

}

// 8.)删除一个分组

- (BOOL)deleteGroup:(NSString *)aGroupName

{

    for (NSString *key in _allPersonDic) {

        if ([key isEqualToString:aGroupName]) {

            [_allPersonDic removeObjectForKey:aGroupName];

            NSLog(@"分组删除成功");

            return YES;

        }

    }

    NSLog(@"该分组不存在");

    return NO;

}

// 9.)展示通讯录中的所有联系人信息

- (void)showAll

{

    for (NSArray *arr in [_allPersonDic allValues]) {

        for (Person *p in arr) {

            [p description];

        }

    } 

}

@end


//  ****** main.m文件 ******

#import

#import "NSString+Characters.h"

#import "Person.h"

#import "AddressBook.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        /*

         main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能:

         1).使用便利构造器创建四个Person类的实例(联系人).

         姓名:Lucy 性别: 电话:123 年龄:21

         姓名:Joe 性别: 电话:456 年龄:17

         姓名:Baby 性别: 电话:789 年龄:27

         姓名:Linda 性别: 电话:000 年龄:20

         

         2).创建一个AddressBook类的实例对象(通讯录).

         3).使用AddressBook类中定义的方法实现:添加联系人,将四个联系人添加到通讯录中.

         4).使用AddressBook类中定义的方法实现:根据电话查找联系人,并打印(查找电话:456);

         5).使用AddressBook类中定义的方法实现:根据性别查找联系人,并将查到的联系人按照年龄升序排序,并打印(查找性别:)

         6).使用AddressBook类中定义的方法实现:根据姓名,更改联系人信息.(修改Linda的信息: 性别: 电话:012 年龄:25);

         7).使用AddressBook类中定义的方法实现:按照姓名删除联系人,并展示通信录中所有人信息.(删除联系人:Baby)

         8).使用AddressBook类中定义的方法实现:删除一个分组,并展示通信录中所有人信息.(删除L)

         9).使用AddressBook类中定义的方法实现:实现3~8之间每个功能后,输出通讯录中所有联系人信息。

         */

        

        Person *p1 = [Person personWithName:@"Lucy" Age:21 Sex:@"" Num:@"123"];

        Person *p2 = [Person personWithName:@"Joe" Age:17 Sex:@"" Num:@"456"];

        Person *p3 = [Person personWithName:@"Nany" Age:27 Sex:@"" Num:@"798"];

        Person *p4 = [Person personWithName:@"Linda" Age:20 Sex:@"" Num:@"000"];

        [p1 description];

        

        AddressBook *add = [AddressBook addressBook];

        

        // 3.)添加联系人

        NSLog(@"============= 添加联系人 ==============");

        [add addPerson:p1];

        [add addPerson:p2];

        [add addPerson:p3];

        [add addPerson:p4];

        [add addPerson:p1];

        NSLog(@"======================================");

        

        // 4.)根据电话查找某个联系人

        NSLog(@"========== 根据姓名查找联系人 ===========");

        [[add findPersonWithPhoneNum:@"123"] description];

        NSLog(@"======================================");

        

        // 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序

        NSLog(@"========== 根据性别查找联系人 ===========");

        NSArray *arr = [add findPersonsWithSex:@""];

        for (int i = 0; i count; i++) {

            [arr[i] description];

        }

        NSLog(@"======================================");

        

        // 6.)根据姓名,更改联系人信息

        NSLog(@"=========== 更改联系人信息 =============");

        [add changePersonWithName:@"Lucy" phoneNum:@"666" sex:@"" age:61];

        [[add findPersonWithPhoneNum:@"666"] description];

        NSLog(@"======================================");

        

        // 7.)按照姓名删除联系人

        NSLog(@"========== 按照姓名删除联系人 ===========");

        [add deletePersonWithName:@"Linda"];

        NSLog(@"======================================");

        

        // 8.)删除一个分组

        NSLog(@"============ 删除一个分组 ==============");

        [add deleteGroup:@"L"];

        NSLog(@"======================================");

        

        // 9.)展示通讯录中的所有联系人信息

        NSLog(@"====== 展示通讯录中的所有联系人信息 =======");

        [add showAll];

    }

    return 0;

}




你可能感兴趣的:(object-c)