实现(简单 和中等) 难度通讯录 操作 - 猎人猫

实现简单通讯录操作。1、定义联系⼈人类Contact。实例变量:姓名、性别、电话号码、住址、分组名称。⽅方法:初始化⽅方法(姓名、电话号码)、显⽰示联系⼈人信息2、在main.m中定义可变数组,管理所有联系人。可以添加新联系人对象,如果姓名或电话号码为空,打印添加失败。
3、获取某个分组下的所有联系⼈。
4、根据电话号码搜索联系人。
5、获取所有⼥女性联系人
6、根据姓名删除联系⼈
7、删除某个分组全部联系人
8、展⽰示通讯录中所有联系人
9、选做:定义AddressBook类,封装上述功能。 


实现中等难度通讯录。需求:

1、定义联系⼈人类Contact。实例变量:姓名(拼⾳音,⾸首字⺟母⼤大写)、性别、电话号码、住址、分组名称、年龄。⽅方法:⾃自定义初始化⽅方法(姓名、电话号码)、显⽰示联系⼈人信息

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

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

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

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

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

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

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


#pragma mark -- 非@property用法


第一,申请一个AddressPerson类

AddressPerson.h

<span style="font-size:14px;">#import <Foundation/Foundation.h>

@interface AddressPerson : NSObject
{
    NSString *_name;
    NSString *_gender;
    NSString *_phoneNumber;
    NSString *_address;
    NSString *_groupName;
    
}

//初始化方法 名字和电话
- (id)initWithPersonName:(NSString *)name
             phoneNumber:(NSString *)phoneNumber;

//set赋值方法
- (void)setPersonGender:(NSString *)gender
                address:(NSString *)address
              groupName:(NSString *)groupName;

//取值方法
- (NSString *)getName;
- (NSString *)getGender;
- (NSString *)getAddress;
- (NSString *)getPhoneNumber;
- (NSString *)getGroupName;

//打印联系人信息
- (void)printPersonInfo;



@end
</span>


AddressPerson.m

<span style="font-size:14px;">#import "AddressPerson.h"

@implementation AddressPerson

- (id)initWithPersonName:(NSString *)name phoneNumber:(NSString *)phoneNumber{
    if (self = [super init]) {
        _name = name;
        _phoneNumber = phoneNumber;
    }
    return self;
}

- (void)setPersonGender:(NSString *)gender address:(NSString *)address groupName:(NSString *)groupName{
    _gender = gender;
    _address = address;
    _groupName = groupName;
}

- (NSString *)getName{
    return _name;
}

- (NSString *)getGender{
    return  _gender;
}

- (NSString *)getGroupName{
    return  _groupName;
}

- (NSString *)getPhoneNumber{
    return  _phoneNumber;
}
- (NSString *)getAddress{
    return  _address;
}

- (void)printPersonInfo{
    NSLog(@"联系人的信息为:名字 %@ , 性别 %@ , 电话 %@ , 地址 %@ , 分组名称 %@" , _name , _gender , _phoneNumber , _address , _groupName);
}


@end</span>


第二,申请一个AddressBook类

AddressBook.h

<span style="font-size:14px;">#import <Foundation/Foundation.h>

@interface AddressBook : NSObject
{
    NSMutableArray *_addressArray;
}

//初始化
- (id)initWithMutableArray:(NSMutableArray *)array;

//添加联系人信息
- (void)addContaxtPersonName:(NSString *)name
                      gender:(NSString *)gender
                 phoneNumber:(NSString *)phoneNumber
                     address:(NSString *)address
                   groupName:(NSString *)groupname;
//打印所有的女性联系人
- (void)searchAllContaxtOfGirl;
//根据组名来查找联系人,你得先拿到查找哪个组。所以需要一个参数 -- 组名
- (void)searchALLContaxtBaseGroupName:(NSString *)groupName;

//根据电话来查找联系人,同样需要一个电话参数作为查找依据
- (void)searchContaxtBasePhoneNumber:(NSString *)phoneNumber;

//根据名字删除联系人
- (void)deleteTheContaxtBaseName:(NSString *)name;
//根据组名来删除联系人
- (void)deleteContaxtsBaseGroupName:(NSString *)groupName;

//打印所有联系人
- (void)printAllContaxtsInOf;

//对数组取值
- (NSMutableArray *)getArray;


@end</span>

AddressBook.m

<span style="font-size:14px;">#import "AddressBook.h"
#import "AddressPerson.h"

@implementation AddressBook

- (id)initWithMutableArray:(NSMutableArray *)array{

    _addressArray = array;
    return self;
}

- (void)addContaxtPersonName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber address:(NSString *)address groupName:(NSString *)groupname{
    
    AddressPerson *tempPerson = [[AddressPerson alloc]initWithPersonName:name phoneNumber:phoneNumber];

    [tempPerson setPersonGender:gender address:address groupName:groupname];
    
    if (!([tempPerson getName] && [tempPerson getPhoneNumber] )) {
        NSLog(@"添加失败 , 请填写号码或者名字");
    }
    
    else{
        
        [_addressArray addObject:tempPerson];
        NSLog(@"添加成功");
        
    }
    
}

- (void)searchAllContaxtOfGirl{
    for (int i = 0; i < [_addressArray count]; i++) {
        if ([[_addressArray[i] getGender]isEqualToString:@"girl"] ) {
            
            [_addressArray[i] printPersonInfo];
        }
    }
}


- (void)searchALLContaxtBaseGroupName:(NSString *)groupName{
    for (int i = 0; i < [_addressArray count]; i ++) {
        if ([[_addressArray[i] getGroupName]isEqualToString:groupName] ) {
            [_addressArray[i] printPersonInfo];
        }
    }
}

- (void)searchContaxtBasePhoneNumber:(NSString *)phoneNumber{
    int i = 0;//希望它做一个全局变量,方便下面使用
    for (i = 0 ; i < [_addressArray count]; i ++) {
        if ([[_addressArray[i] getPhoneNumber] compare:phoneNumber ] ) {
            [_addressArray[i] printPersonInfo ];
            //找到这个人之后,就结束吧,下面的不需要再执行了
            return;
        }
    }
    //但是如果,数组都全部遍历一遍之后还没有找到这个人,那么.....
    if (i == [_addressArray count] ) {
        NSLog(@"亲,您的号码是不是输错了啊!");
    }
    
}
//封装的中心思想就是把某些功能放到其他类里面来写。这样就减轻mian.m的工作量。但是,不管是OC还是C,数据--永远是我们最关注的事情。所以,在封装的时候,我们把在main.m里面写好的数据,用间接传值的方式,传了进来。而且,以后也会继续做这件事情。所以,大家不要感觉压力太大或是太难,学习就是个循序渐进的过程,见过的多了就会有经验了!加油!


//根据名字来删联系人
- (void)deleteTheContaxtBaseName:(NSString *)name{
    NSLog(@"要删除的联系人的名字是%@" , name);
    for (int i = 0; i < [_addressArray count]; i++) {
        if ([[_addressArray[i] getName]isEqualToString:name]) {
            
            //第一种删除方式
            [_addressArray removeObject:_addressArray[i]];
            //第二种删除
            [_addressArray removeObjectAtIndex:i];
            
        }
    }
}

- (void)deleteContaxtsBaseGroupName:(NSString *)groupName{
    NSLog(@"删除%@组" , groupName);

    for (int i = 0; i < [_addressArray count] ; i ++) {
        if ([[_addressArray[i] getGroupName]isEqualToString:groupName]) {
            [_addressArray removeObjectAtIndex:i];
        }
    }
}



- (void)printAllContaxtsInOf{
    for (AddressPerson *person in _addressArray) {
        NSLog(@"名字 %@, 性别 %@  , 电话号码: %@ , 地址 :%@ , 分组:%@" , [person getName] , [person  getGender] , [person getPhoneNumber] , [person getAddress] , [person getGroupName]);
        
    }
}


@end</span>


第三,申请一个AddressBookManager类

AddressBookManager.h

<span style="font-size:14px;">#import <Foundation/Foundation.h>
#import "AddressPerson.h"
@interface AddressBookManager : NSObject
//这个字典,就是用来存储所有的联系人
{
    NSMutableDictionary *_mutableDic;
    
}
//初始化
- (id)initWithMutableDic:(NSMutableDictionary *)dictionary;

- (NSMutableDictionary *)getDic;

//在此之前,大家的手机通讯录,是怎么快速查找到一个人的?

- (void)addContaxtPerson:(AddressPerson *)person;
//根据号码查找联系人
- (AddressPerson *)searchTheContaxtBasePhoneNumber:(NSString *)phoneNumber;

//根据号码来删除联系人
- (AddressPerson *)deleteTheContaxtBasePhoneNumber:(NSString *)phoneNumber;
- (void)printAddressBook;

@end
</span>

AddressBookManager.m

<span style="font-size:14px;">#import "AddressBookManager.h"

@implementation AddressBookManager


- (id)initWithMutableDic:(NSMutableDictionary *)dictionary{
    _mutableDic = dictionary;
    return self;
    
}

#pragma mark -- 下面有个地方需要大家修改啊!!!!!!!!

- (void)addContaxtPerson:(AddressPerson *)person{
    // 第一步,先把这个联系人的名字拿到,之后首字母变大写。。然后,在进行取首字母操作。
    NSString *capitalLetter = [[[person getName] capitalizedString] substringToIndex:1];
    //这个时候呢,如果是一个从未被创建的键值对,这个数组肯定还没有被开辟过。肯定是没有值的,但是,没有关系,我们下面会判断一下!!
    // 但是如果已经有这个键值对的话,就无需在看下面的了!
    NSMutableArray *tempArray = [_mutableDic objectForKey:capitalLetter];
    // 这个就是用来判断,如果数组从未被创建,直接赋值的话肯定是空的。所以,判断一下,如果数组为空,就重❤️创建一个键值对,以首字母为 键,以数组为 值。。
    if (! tempArray) {
        ///
        
        /嗨  在这里,大家修改一下啊
          tempArray = [[NSMutableArray alloc]init];
        [_mutableDic setObject:tempArray forKey:capitalLetter];
        
    }
    //最后一步,把添加的联系人加进数组中
    [tempArray addObject:person];
}
- (NSMutableDictionary *)getDic{
    return _mutableDic;
}

//方法的实现
- (AddressPerson *)searchTheContaxtBasePhoneNumber:(NSString *)phoneNumber{
    //通过快速遍历,来查找联系人
    for (NSString *key in _mutableDic) {
        //这一步,就是通过遍历字典,来得到字典里面的值,只不过这个值比较庞大,是一个数组!
        NSMutableArray *tempArr = [_mutableDic objectForKey:key];
        //下面该遍历这个数组了,在数组里面找人。找到人之后,在把号码取出来比较一下!!
        for (AddressPerson *person in tempArr) {
            //通过,一层一层的获取。把联系人的号码拿到之后,跟行参传进来的值进行比较。如果比较成功。就进行打印。并且停止查找
            if ([[person getPhoneNumber]isEqualToString:phoneNumber]) {
                [person printPersonInfo];
                //停止查找
                return  person;
            }
        }
        
        
    }
    return nil;
}

- (AddressPerson *)deleteTheContaxtBasePhoneNumber:(NSString *)phoneNumber{
  //这一步,先通过号码,找到这个人。 之后再删除,所以第一步先找人
    //我们上一个方法就是通过号码找人的,可否拿来借用一下啊???
    //通过借助上面查找联系人的方法,在这里做一个嵌套。
    AddressPerson *person1 = [self searchTheContaxtBasePhoneNumber:phoneNumber];
    if (person1) {
        //如果,已经找到这个人,就把这个人的名字的首字母拿出来。可以通过 kay来取值
        NSString *captialLetter = [[[person1 getName] capitalizedString]substringToIndex:1];
        
        //先找到这个人所在的数组
        NSMutableArray *tempArray = [_mutableDic objectForKey:captialLetter];
        //既然已经找到了这个人所在的数组,那就直接删除吧
        [tempArray removeObject:person1];
        
        //如果,这个数组里面的人已经被删空了,那就把数组也给删除吧
        if ([tempArray count] == 0) {
            [_mutableDic removeObjectForKey:captialLetter];
        }
    }
    return nil;
}

- (void)printAddressBook {
    for (NSString *key in _mutableDic) {
        NSLog(@"Group %@:\n%@", key, _mutableDic[key]);
    }
}

@end</span>

第四,main.m里面调用

<span style="font-size:14px;">#import <Foundation/Foundation.h>

#import "AddressPerson.h"
#import  "AddressBook.h"

#import  "AddressBookManager.h"
int main(int argc, const char * argv[]) {
    
  
    
   //开始创建对象
   
    AddressBookManager *manager = [[AddressBookManager alloc]initWithMutableDic:[NSMutableDictionary dictionary ]];
    
    
    
    AddressPerson *one = [[AddressPerson alloc]initWithPersonName:@"AAA" phoneNumber:@"13523423456"];
    [one setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
    
    [manager addContaxtPerson:one];
    
    
    
    AddressPerson *two = [[AddressPerson alloc]initWithPersonName:@"BBB" phoneNumber:@"187987654321"];
    [two setPersonGender:@"boy" address:@"USA" groupName:@"陌生人"];
    
    [manager addContaxtPerson:two];
    
    AddressPerson *three = [[AddressPerson alloc]initWithPersonName:@"CCC" phoneNumber:@"1357894562"];
    [three setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
    [manager addContaxtPerson:three];
    AddressPerson *four = [[AddressPerson alloc]initWithPersonName:@"DDD" phoneNumber:@"1357890962"];
    [four setPersonGender:@"boy" address:@"China" groupName:@"陌生人"];
    [manager addContaxtPerson:four];
    AddressPerson *five = [[AddressPerson alloc]initWithPersonName:@"FFF" phoneNumber:@"1357894562"];
    
    [five setPersonGender:@"girl" address:@"China" groupName:@"朋友"];
    
    [manager addContaxtPerson:five];
    
 NSLog(@"%@" ,   [manager getDic]);
    
    //创建数组,把五个联系人放进数组里面
//    NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithObjects:one , two , three , four , five, nil];
//    NSLog(@"%@" , mutableArray);
//   
//    
//    AddressBook *array = [[AddressBook alloc]initWithMutableArray:mutableArray];
// //   [array addContaxtPersonName:@"Haha" gender:@"boy" phoneNumber:@"1234543234"
  address:@"China"
  groupName:@"朋友"];
//    NSLog(@"打印所有人的信息");
//  //  [array printAllContaxtsInOf];
//    NSLog(@"打印所有的女生");
    [array searchAllContaxtOfGirl];
    [array deleteTheContaxtBaseName:@"BBB"];
//    [array deleteContaxtsBaseGroupName:@"朋友"];
//    [array printAllContaxtsInOf];

    
    NSLog(@"%@" , [manager getDic]);
    [manager printAddressBook];
    
    return 0;
}
</span>


#pragma mark -- @property用法

第一,创建Person类

Person.h


#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic , retain)NSString *name;
@property (nonatomic , retain)NSString *gender;
@property (nonatomic , retain)NSString *groupName;
@property (nonatomic , retain)NSString *phoneNumber;


- (id)initWithPersonName:(NSString *)name
                 gender:(NSString *)gender
              groupName:(NSString *)groupName
            phoneNumber:(NSString *)phoneNumber;

+ (id)personWithName:(NSString *)name
              gender:(NSString *)gender
           groupName:(NSString *)groupName
         phoneNumber:(NSString *)phoneNumber;

@end

Person.m

#import "Person.h"

@implementation Person

- (id)initWithPersonName:(NSString *)name gender:(NSString *)gender groupName:(NSString *)groupName phoneNumber:(NSString *)phoneNumber{
    
    if (self = [super init]){
        _name = name;
        _gender = gender;
        _phoneNumber = phoneNumber;
        _groupName = groupName;
    }
    return  self;
}


+ (id)personWithName:(NSString *)name gender:(NSString *)gender groupName:(NSString *)groupName phoneNumber:(NSString *)phoneNumber{
    Person *one = [[Person alloc]initWithPersonName:name gender:gender groupName:groupName phoneNumber:phoneNumber];
    return  one;
}



@end

第一,创建AddressBook类

AddressBook.h

#import <Foundation/Foundation.h>

@interface AddressBook : NSObject

@property (nonatomic , retain)NSMutableArray *mutableArray;

//创建初始化方法,借用这个方法来传值
- (id)initWithMutableArray:(NSMutableArray *)array;

//方法的声明
//查找所有的女生
- (void)searchAllContactOfGirl;
//按照号码查找
- (void)searchAllContactByPhoneNumber:(NSString *)number;
//按名字删除
- (void)deleteTheContactByName:(NSString *)name;

@end


AddressBook.m

<span style="font-size:14px;">#import "AddressBook.h"
#import "Person.h"
@implementation AddressBook

- (id)initWithMutableArray:(NSMutableArray *)array{
    if (self=[super init]){
        _mutableArray = array;
    }
    return  self;

}

//查找所有女生
- (void)searchAllContactOfGirl{
    //1.先遍历数组,因为对象都在数组中,再把性别拿出来看看
    for (Person *obj in _mutableArray){
        if ([obj.gender isEqualToString:@"girl"]){
            NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",obj.name , obj.gender , obj.groupName , obj.phoneNumber);
        }
    }
}

//按照号码查找联系人

- (void)searchAllContactByPhoneNumber:(NSString *)number{
    NSLog(@"查询了电话号码后为");
    for (Person *object in _mutableArray){
        if ([object.phoneNumber isEqualTo:number]){
            NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",object.name , object.gender , object.groupName , object.phoneNumber);
        }
    }
}

//按名字删除
- (void)deleteTheContactByName:(NSString *)name{
    NSLog(@"按照某人姓名删除");
    for (Person *object in _mutableArray){
        if ([object.name isEqualTo:name]){
            NSLog(@"删除的人的名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",object.name , object.gender , object.groupName , object.phoneNumber);
            [_mutableArray removeObject:object];
            //第一种方式
            break;//安全起见,找到这个对象后就停止循环,不在查找。
        }
    }
            //第二种方式
                NSLog(@"按照某人姓名删除");
                for (int i = 0; i < [_mutableArray count] ; i ++){
                    if ([[[_mutableArray objectAtIndex:i]name] isEqualTo:name]){
                        [_mutableArray removeObjectAtIndex:i];
                    }
                }
                for (int i = 0; i < [_mutableArray count] ; i ++){
                NSLog(@"名字是%@ , 性别是%@ , 分组是%@ , 电话号码是%@",[[_mutableArray objectAtIndex:i]name] , [[_mutableArray objectAtIndex:i]gender] , [[_mutableArray objectAtIndex:i]groupName] ,[[_mutableArray objectAtIndex:i]phoneNumber]);
                }
            //第三种
        for (int i = 0; i < [_mutableArray count] ; i ++){
            Person *two = [_mutableArray objectAtIndex:i];
            if ([two.name isEqualTo:name]){
                [_mutableArray removeObjectAtIndex:i];
            }
        }
}


@end</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值