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

(注:使用MRC)

一、功能描述:

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

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

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

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

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

姓名:Linda 性别:女 电话:000 年龄:21

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

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

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

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

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

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

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

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

二、功能实现提示:

1、功能一

定义Person类

1)声明属性:姓名,年龄,性别,电话,分组。注:年龄是int类型,其余属性时NSString类型;分组是姓名首字母(大写),使用提供的类目:NSString+Characters中的方法获取。(3分)

2)重写description方法,输出Person对象的信息。例如: “姓名:张三 性别:男 年龄:22 电话:123456789”.(2分)

3)定义Person类的便利构造器方法,方法包含参数:姓名、年龄、性别、电话.(5分)

2、功能二

定义AddressBook类.

1)声明属性:allPersonDic(字典类型)。使用声明的字典作为容器,分组管理通讯录中所有联系人;字典的Key值为分组名(姓名首字母,大写),value值为数组,数组中存放联系人(Person实例).(5分)

2)在AddressBook的初始化方法中,初始化allPersonDic。(5分)

3)重写dealloc方法,在dealloc方法中实现AddressBook类的内存管理。(5分)

3、功能三

添加联系人.要求(15分)

a.在AddressBook类中定义方法:

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

b.判断姓名和电话不能为空否则添加失败.

c.判断是否已经存在分组,存在直接存储.不存在创建分组后再存储.(注:联系人不能有重名).

d.添加成功返回YES,姓名为空或者有重名的添加失败返回NO.

e.数据使用Person存储.

4、功能四

根据电话查找某个联系人.(10分)

a:在AddressBook类中定义方法:

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

b:如果找到返回该联系人,否则返回nil.

c.忽略电话重复问题,只返回第一个查找到的联系人。

5、功能五

根据性别查找联系人,并将查到的联系人按照年龄升序排序(15分)

a:在AddressBook类中定义方法:

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

b:查找到联系人放入数组,排序的时候使用block.

6、功能六

根据姓名,更改联系人信息.(10分)

a:在AddressBook类中定义方法:

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

b:找到该联系人并修改该成功返回YES,否则返回NO

c.修改电话、性别、年龄,参数不能为空。

7、功能七

按照姓名删除联系人.(15分)

a.在AddressBook类中定义方法:

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

b.删除成功返回YES,否则返回NO;

c.当删除联系人后分组为空时,需要删除该分组。

8、功能八

删除一个分组.(5分)

a.在AddressBook类中定义方法:

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

b.删除成功返回YES,否则返回NO;

9、功能九

展示通讯录中的所有联系人信息(5分)

a:在AddressBook类中定义方法:

-(void)showAll;

b.通过重写description方法展示联系人信息 。

Person.h

#import 

@interface Person : NSObject
//一、定义联系人类Person
//实例变量:姓名、性别、电话号码、住址、分组名称。
//方法:初始化方法(姓名、电话号码)、显示联系人信息
@property(nonatomic,retain)NSString *name;
@property(nonatomic,retain)NSString *sex;
@property(nonatomic,retain)NSString *phoneNum;
@property(nonatomic,assign)int age;
@property(nonatomic,retain)NSString *address;
@property(nonatomic,retain)NSString *group;

- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex
                    phoneNum:(NSString *)phoneNum
                         age:(int)age;

// 便利构造器
+ (instancetype)personWithName:(NSString *)name
                         sex:(NSString *)sex
                    phoneNum:(NSString *)phoneNum
                         age:(int)age;

@end

Person.m

#import "Person.h"

@implementation Person
//Person类的实现:1.初始化方法 2.重写description函数
- (instancetype)initWithName:(NSString *)name
                         sex:(NSString *)sex
                    phoneNum:(NSString *)phoneNum
                         age:(int)age
                    {
    self = [super init];
    if (self) {
        self.name = name;
        self.sex = sex;
        self.phoneNum = phoneNum;
        self.age = age;
       
       
    }
    //判断首字母,给组名称赋值
    if ([name length] > 0) {
        NSString *firstname = [name substringToIndex:1];
        self.group = [firstname uppercaseString];
    }
//    NSLog(@"%@",self.group);
    return self;
}


// 便利构造器
+ (instancetype)personWithName:(NSString *)name
                         sex:(NSString *)sex
                    phoneNum:(NSString *)phoneNum
                         age:(int)age{
    Person *person = [[Person alloc]initWithName:name sex:sex phoneNum:phoneNum  age:age];
    return [person autorelease];
}





- (NSString *)description{
    return [NSString stringWithFormat:@"姓名:%@ 性别:%@ 年龄:%d 电话:%@",_name,_sex,_age,_phoneNum];
}


- (void)dealloc{
    NSLog(@"空间释放");
    [_name release];
    [_sex release];
    [_phoneNum release];
    [_group release];
    [super dealloc];
}

@end

AddressBook.h

#import 
#import "NSString+Character.h"
@class Person;
//AddressBook类的声明:
/*
  1.重写init方法,初始化字典
  2.可以添加新联系人对象
  3.根据姓名删除联系人
  4.删除某分组的所有联系人
  5.根据电话号码搜索联系人
  6.获取所有某性联系人,并将查到的联系人按照年龄升序排序
  7.根据姓名,更改联系人信息
  8.展示通讯录中的所以联系人信息
 */
@interface AddressBook : NSObject

//创建一个字典存储数据
@property(nonatomic,retain)NSMutableDictionary *dic;
//1.重写init方法,初始化字典
- (id)initWithMutableDic:(NSMutableDictionary *)dic;

//2.可以添加新联系人对象
- (BOOL)addPerson:(Person *)aPerson;
//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:(int) aAge;
//8.展示通讯录中的所以联系人信息
-(void)showAll;
@end

AddressBook.m

#import "AddressBook.h"
#import "Person.h"
@implementation AddressBook

//1.重写init方法,初始化字典
//- (instancetype)init{
//    self = [super init];
//    _dic = [NSMutableDictionary dictionaryWithCapacity:1];//创建一个可变词典初始指定它的长度为1.,动态的添加数据如果超过1这个词典长度会自动增加,所以不用担心数组越界。
//    if (self) {
//        for (int i = 65; i < 91; i++) {
//            NSString *key = [NSString stringWithFormat:@"%c",i];
//            [_dic setObject:[NSMutableArray arrayWithCapacity:1]forKey:key];
//        }
//    }
//    NSLog(@"%@",_dic);
//    return self;
//}


//1.重写init方法,初始化字典
- (id)initWithMutableDic:(NSMutableDictionary *)dic{
    if (self = [super init]) {
        _dic = dic;
    }
    return self;
}
//- (void)dealloc{
//    [_dic release];
//    [super dealloc];
//}

//2.可以添加新联系人对象
- (BOOL)addPerson:(Person *)aPerson{
    BOOL isAdd = NO;
    if ((aPerson.name == nil || aPerson.phoneNum == nil ) || ([aPerson.name isEqualToString:@""] || [aPerson.phoneNum isEqualToString:@""])) {
        
        
        NSLog(@"信息不完整,添加失败");
        return isAdd;
    }
    
    //获取名字的首字母,并且大写。当作字典的key(键)
    NSString *key = [aPerson.name  uppercaseFirstLetter];
    //通过键来查找数组
    NSMutableArray *tempArray = [_dic objectForKey:key];
    if (! tempArray) {
        //给数组分配空间
        tempArray = [[[NSMutableArray alloc]init]autorelease];
        //创建键值对
        [_dic setObject:tempArray forKey:key];
    }
    //检查一下是否有重名的
    for (int i = 0; i < [tempArray count]; i ++) {
        if ([aPerson.name isEqualToString:[tempArray[i] name]]) {
            NSLog(@"有重名的,添加失败");
            return isAdd;
        }
    }
    //把联系人加进创建好的数组里面
    
    [tempArray addObject:aPerson];
    isAdd = YES;
    
    
    return isAdd;
}
//3.根据姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName{
    for (NSString *key in _dic) {
        
        NSMutableArray *tempArray = [_dic objectForKey:key];
        
        //遍历数组
        for (Person *person in tempArray) {
            if ([person.name isEqualToString:aPersonName]) {
                [tempArray removeObject:person];
                NSLog(@"找到要删除的人了");
                //如果这个人,是分组里面最后一个,就把分组也删除
                if ([tempArray count] == 0) {
                    //在字典里面删除键值对
                    [_dic removeObjectForKey:key];
                    NSLog(@"数组已经被删除");
                }
                return YES;
            }
        }
    }
    NSLog(@"没有找到");
    return NO;
    
}


//4.删除某分组的所有联系人
- (BOOL)deleteGroup:(NSString *)aGroupName{
    //先判断,有么有这个分组
    for (NSString *key in _dic) {
        if ([key isEqualToString:aGroupName]) {
            
            
            //先通过传进来的键,来获取字典里面的值(数组)
            NSMutableArray *tempArray = [_dic objectForKey:aGroupName];
            //删完这个数组里面的所有元素
            [tempArray removeAllObjects];
            //删除字典里面的键值对,通过键来删除
            [_dic removeObjectForKey:aGroupName];
            
            NSLog(@"找到分组,删除成功");
            return YES;
            
            
        }
    }
    
    
    
    NSLog(@"没有这个分组");
    return NO;
    
}
//5.根据电话号码搜索联系人
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum{
    //第一步,把字典里面的键拿出来,通过键来取值
    for (NSString *key in _dic) {
        //通过objectForKey: 这个方法,把字典里面的数组拿出来
        NSMutableArray *tempArray = [_dic objectForKey:key];
        //遍历拿出来的数组,让数组里面每一个人的号码,和 形参的值进行比较。
        for (Person *p in tempArray) {
            
            if ([p.phoneNum isEqualToString:aPhoneNum]) {
                
                NSLog(@"人找到了");
                NSLog(@"%@",p);
                return p;
            }
        }
    }
    
    NSLog(@"没有找到该联系人");
    return nil;
}
//6.获取所有某性联系人,并将查到的联系人按照年龄升序排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex{
    //声明数组,用来储存性别相同的人
    NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
    
    //然后再开始,遍历字典,拿到键值,遍历数组
    
    for (NSString *key in _dic) {
        NSMutableArray *array = [_dic objectForKey:key];
        for (Person *person in array) {
            //跟上一方法不同的地方
            if ([person.sex isEqualToString:aSex]) {
                
                [mutableArray addObject:person];
                
            }
        }
    }
    
    [mutableArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        
        Person *per1 = (Person *)obj1;
        Person *per2 = (Person *)obj2;
        
        if ( per1.age  > per2.age ) {
            return NSOrderedDescending;
        }
        else if (per1.age < per2.age){
            return NSOrderedAscending;
        }
        return NSOrderedSame;
    }];
    
//     [mutableArray sortUsingSelector:@selector(compare:)];
//    NSLog(@"%@",mutableArray);
    return mutableArray;
}
//7.根据姓名,更改联系人信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(int)aAge{
    //第一步,先遍历
    
    for (NSString *key  in _dic) {
        //通过key来取值
        NSMutableArray *tempArray = [_dic objectForKey:key];
        
        //开始遍历数组
        for (Person *person in tempArray) {
            if ([person.name isEqualToString:name]) {
                //找到人后,开始修改,把传进来的新的信息赋值给这个人
                person.phoneNum = aNum;
                person.sex = aSex;
                person.age = aAge;
                
                NSLog(@"赋值成功");
                NSLog(@"%@",person);
                return YES;
                
            }
        }
        
    }
    
    
    return NO;
    
}
//8.展示通讯录中的所有联系人信息
-(void)showAll{
    NSLog(@"%@",_dic);
}
@end

NSString+Character.h

#import 

@interface NSString (Character)
- (NSString *)uppercaseFirstLetter;

@end

NSString+Character.m

#import "NSString+Character.h"

@implementation NSString (Character)
- (NSString *)uppercaseFirstLetter{
    
    return [[self uppercaseString] substringToIndex:1];
    
}

@end

main.m


#import 
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 1.创建一个AdderssBook类的实例
        AddressBook *book = [[AddressBook alloc]initWithMutableDic:[NSMutableDictionary dictionary]];
       //  2.使用便利构造器创建四个Person的实例
        Person *person1 = [Person personWithName:@"Lucy" sex:@"女" phoneNum:@"123" age:21];
        Person *person2 = [Person personWithName:@"Joe" sex:@"男" phoneNum:@"456" age:17];
        Person *person3 = [Person personWithName:@"Boby" sex:@"女" phoneNum:@"789" age:27];
        Person *person4 = [Person personWithName:@"Linda" sex:@"女" phoneNum:@"000" age:21];
        Person *person5 = [Person personWithName:@"Lili" sex:@"女" phoneNum:@"110" age:12];
        // 3.调用添加联系人的方法,将四个联系人添加到通讯录中
        [book addPerson:person1];
        [book addPerson:person2];
        [book addPerson:person3];
        [book addPerson:person4];
        [book addPerson:person5];
        [book showAll];
        
        // 4.根据电话查找联系人,并打印(查找电话:456)
        [book findPersonWithPhoneNum:@"456"];
        // 5.根据性别查找联系人,并将查找的联系人按照年龄的升序排序,并打印(查找性别:女)
        [book findPersonsWithSex:@"女"];
        // 6.根据姓名,更改联系人信息。(修改Linda的信息:性别:女电话:012年龄:25)
        [book changePersonWithName:@"Linda" phoneNum:@"012" sex:@"女" age:25];
        // 7.按照姓名删除联系人,并展示通讯录中所有的人信息(删除联系人:Baby)
        [book deletePersonWithName:@"Boby"];
        // 8.删除一个分组,并展示通讯录中所有的人。(删除L组)
        [book deleteGroup:@"L"];
        [book autorelease];
    }
    return 0;
}

你可能感兴趣的:(用OC语言完成简易通讯录(实现增删改查)功能)