OC: 用OC语言完成简易通讯录(实现增删改查)功能.

本文介绍如何使用Objective-C实现一个简易通讯录应用,包括添加、删除、查找和修改联系人等功能。采用字典存储联系人信息,每个联系人属于一个分组。
要求描述:用OC语言完成简易通讯录(实现增删改查)功能.
 (注:使用MRC)
    1.创建AddressBook类.
        1)使用字典作为容器,字典的Key值为分组名(姓名首字母,大写),value值为数组,数组中存放联系人(Person实例).(5分)
        2)添加联系人.要求(20分)
            a.判断姓名和电话不能为空否则添加失败.
            b.判断是否已经存在分组,存在直接存储.不存在创建分组后再存储.(注:联系人不能有重名).
            c.添加成功返回YES,姓名为空或者有重名的添加失败返回NO.
            d.数据使用Person存储.
            e.方法:- (BOOL)addPerson:(Person *)aPerson;
 
        3)按照姓名删除联系人.(15分)
            a.方法:- (BOOL)deletePersonWithName:(NSString*)aPersonName;
            b.删除成功返回YES,否则返回NO;
            c.当删除联系人后分组为空时,需要删除该分组。
 
        4)删除一个分组.(10分)
            a:方法:- (BOOL)deleteGroup:(NSString *)aGroupName;
            b.删除成功返回YES,否则返回NO;
 
        5)根据电话查找某个联系人.(10分)
            a:方法:-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
            b:如果找到返回该联系人,否则返回nil.
            c.忽略电话重复问题,只返回第一个查找到的联系人。
 
        6)根据性别查找联系人,并将查到的联系人按照年龄升序排序(15分)
            a:方法:-(NSArray *)findPersonsWithSex:(NSString *)aSex;
            b:查找到联系人放入数组,排序的时候使用block.
 
        7)根据姓名,更改联系人信息.(10分)
            a:方法:-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;
            b:找到该联系人并修改该成功返回YES,否则返回NO
            c.修改电话、性别、年龄,参数不能为空。
 
        8)展示通讯录中的所有联系人信息(5分)
            a:方法:-(void)showAll;
            b.通过重写description方法展示联系人信息 。
 
    2.使用Person类.(属性:姓名,年龄,性别,电话)
        1)重写description方法,输出 “姓名:张三   性别:男   年龄:22   电话:123456789”.(5分)

        2)使用便利构造器创建对象.(5分)


AddressBook.h

#import <Foundation/Foundation.h>
#import "Person.h"



@interface AddressBook : NSObject

// 1.声明一个有可变字典实例变量的属性,用来按组存放通讯录信息
@property (nonatomic,retain)NSMutableDictionary * personDic;

// 2.添加联系人
-(BOOL)addPerson:(Person *)newPerson;

// 3.按照姓名删除联系人
-(BOOL)deletePersonWithName:(NSString*)aPersonName;

// 4.删除一个分组
-(BOOL)deleteGroup:(NSString *)aGroupName;

// 5.根据电话查找某个联系人
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;

// 6.根据性别查找联系人,并将查到的联系人按照姓名排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex;

// 7.根据姓名,更改联系人的信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;

// 8.显示通讯录中所有联系人
-(void)showAll;

@end

AddressBook.m

#import "AddressBook.h"

@implementation AddressBook

// 重写init方法,给 personDic 在堆区分配一个空间
-(id)init
{
    if (self = [super init]) {
        self.personDic = [[NSMutableDictionary alloc]init];
    }
    return self;
}

// 2.添加联系人
-(BOOL)addPerson:(Person *)newPerson
{
    // a.判断姓名和电话不能为空否则添加失败.
    if (newPerson.name == nil || newPerson.tel == nil) {
        NSLog(@"姓名或电话为空,添加失败!");
        return NO;
    }
    // 判断是否有重名,如果有添加失败。
    for (NSString *key in _personDic) {
        for (Person *person in _personDic[key]) {
            if (person.name == newPerson.name) {
                NSLog(@"姓名重复,添加失败");
                return NO;
            }
        }
    }
    // 判断是否存在分组,不存在,创建之后再存储,存在就直接存储。
    NSMutableArray *array = _personDic[newPerson.groupName];
    if (array == nil) {
        array = [[NSMutableArray alloc]init];
        [_personDic setValue:array forKey:newPerson.groupName];
    }
    [array addObject:newPerson];
    NSLog(@"添加联系人成功 !!! ");
    return YES;
}

// 3.按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName
{
/*    
    for (NSString *key in _personDic) {
//        for (int i = 0; i < [_personDic[key] count]; i++) {
//            if ([[_personDic[key][i] name] isEqualToString:aPersonName]) {
//                [_personDic[key] removeObject:_personDic[key][i]];
//                NSLog(@"delete Person %@ success",aPersonName);
//                if ([_personDic[key] count] == 0) {
//                    [_personDic removeObjectForKey:key];
//                }
//                return YES;
//            }
//        }
//    }
*/
    for (NSString * key in _personDic) {
        for (Person * p in _personDic[key]) {
            if ([p.name isEqualToString:aPersonName]) {   //p.name == aPersonName 也行 研究下
                NSLog(@"删除联系人 %@ 成功",aPersonName);
                [_personDic[key] removeObject:aPersonName];
                // 如果删除联系人之后分组为空,则把分组删掉。
                if ([_personDic[key] count] == 0) {
                    [_personDic removeObjectForKey:key];
                }
                return YES;
            }
        }
    }
    NSLog(@"没有这个人,无需删除!");
    return NO;
}

// 4.删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName
{
    if (_personDic[aGroupName]) {
        [_personDic removeObjectForKey:aGroupName];
        NSLog(@"删除分组成功!!!");
        return YES;
    }
    NSLog(@"没有该分组,无需删除 !!!");
    return NO;
}

// 5.根据电话查找某个联系人
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum
{
    for (NSString *key in _personDic) {
        for (Person *person in _personDic[key]) {
            if ([person.tel isEqualToString:aPhoneNum]) {
                NSLog(@"根据电话号码找到了这个联系人:");
                return person;
            }
        }
    }
    NSLog(@"根据电话号码没有找到这个人!!!");
    return nil;
}

// 6.根据性别查找联系人,并将查到的联系人按照姓名排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex
{
    NSMutableArray *array = [NSMutableArray array];
    for (NSString *key in _personDic) {
        for (Person *person in _personDic[key]) {
            if ([person.sex isEqualToString:aSex]) {
                [array addObject:person];
            }
        }
    }
    // [array sortUsingSelector:@selector(compareByAge:)];
//    [array sortUsingComparator:^NSComparisonResult(Person* obj1, Person* obj2) {
//        return obj1.age>obj2.age;
//    }];
    [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return obj1>obj2;
    }];
    return array;
}

// 7.根据姓名,更改联系人的信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge
{
    for (NSString * key in _personDic) {
        for (Person * person in _personDic[key]) {
            if ([person.name isEqualToString:name]) {
                if (aNum == nil || aSex == nil || aAge == 0) {
                    NSLog(@"修改参数为空,添加失败");
                    return NO;
                }else{
                    person.tel = aNum;
                    person.sex = aSex;
                    person.age = aAge;
                    NSLog(@"修改成功");
                    return YES;
                }
            }
        }
    }
    NSLog(@"没有找到该联系人,修改失败");
    return NO;
}

// 8.显示通讯录中所有联系人
-(void)showAll
{
    NSLog(@"%@",_personDic);
}
@end

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

// 声明属性(包含姓名、年龄、性别、电话)
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,copy)NSString *sex;
@property (nonatomic,copy)NSString *tel;

// 声明属性(分组名)
@property(nonatomic,copy)NSString * groupName;
//初始化方法
-(id)initWithName:(NSString *)name
              age:(NSInteger)age
              sex:(NSString *)sex
              tel:(NSString *)tel;

// 2.2 便利构造器
+(Person *)personWithName:(NSString *)name
                      age:(NSInteger)age
                      sex:(NSString *)sex
                      tel:(NSString *)tel;
// 2.1 重写description
-(NSString *)description;

// 通过年龄进行排序
-(NSComparisonResult)compareByAge:(Person *)person;

@end

Person.m

#import "Person.h"

@implementation Person

-(id)initWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex tel:(NSString *)tel
{
    if ([super init]) {
        _name = name;
        _age = age;
        _sex = sex;
        _tel = tel;
        _groupName = [[name substringToIndex:1]uppercaseString];
    }
    return self;
}

+(Person *)personWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex tel:(NSString *)tel
{
    Person *per = [[Person alloc]initWithName:name age:age sex:sex tel:tel];
    return per ;
}

-(NSString *)description
{
    return [NSString stringWithFormat:@"name: %@ age: %ld sex: %@ tel: %@",self.name,self.age,self.sex,self.tel];
}

//通过年龄进行排序
-(NSComparisonResult)compareByAge:(Person *)person
{
    if (self.age > person.age) {
        return 1;
    }else if (self.age < person.age){
        return -1;
    }else
    {
        return 0;
    }
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建通讯录
        AddressBook *newPersonBook = [[AddressBook alloc]init];
        //创建联系人
        Person *p1 = [Person personWithName:@"Zhangsan" age:22 sex:@"m" tel:@"158"];
        Person *p2 = [Person personWithName:@"Lisi" age:18 sex:@"f" tel:@"131"];
        Person *p3 = [Person personWithName:@"Wangwu" age:19 sex:@"m" tel:@"187"];
        Person *p4 = [Person personWithName:@"Zhaoliu" age:21 sex:@"f" tel:@"167"];
        Person *p5 = [Person personWithName:@"Qianqi" age:20 sex:@"f" tel:@"199"];
        Person *p6 = [Person personWithName:@"Wangwang" age:17 sex:@"m" tel:@"101"];
        Person *p7 = [Person personWithName:@"Hejiu" age:18 sex:@"m" tel:@"103"];
        Person *p8 = [Person personWithName:@"Jan" age:20 sex:@"m" tel:@"102"];
        
        // 2.添加联系人到通讯录
        [newPersonBook addPerson:p1];
        [newPersonBook addPerson:p2];
        [newPersonBook addPerson:p3];
        [newPersonBook addPerson:p4];
        [newPersonBook addPerson:p5];
        [newPersonBook addPerson:p6];
        [newPersonBook addPerson:p7];
        [newPersonBook addPerson:p8];
        
        // 3.按照姓名删除某个联系人
        [newPersonBook deletePersonWithName:@"Lisi"];
        
        // 4.删除某个分组
        [newPersonBook deleteGroup:@"Z"];
        
        // 5.根据电话查找某个联系人
        Person *findper =  [newPersonBook findPersonWithPhoneNum:@"102"];
        NSLog(@"%@",findper);
        
        // 6.根据性别查找联系人,并将查到的联系人按照年龄升序排序
        NSLog(@"%@",[newPersonBook findPersonsWithSex:@"f"]);
        
        // 7.修改联系人信息
        [newPersonBook changePersonWithName:@"Wangwu" phoneNum:@"100" sex:@"m" age:99];
        
        // 8.显示全部
        [newPersonBook showAll];
        
    }
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值