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