@implementation AddressBook
// 系统预设好的init方法
- (instancetype)init
{
self = [super init];
if (self) {
// 容器类在使用之前 必须先进行初始化
self.contactDic = [NSMutableDictionary dictionary];
// 创建字典套数组结构 联系人分组信息
[self group];
}
return self;
}
// 获取分组信息
// 私有方法 写在.m文件的实现中 没有在.h汇总声明 只能在本类中(.m中)使用
- (void)group
{
// 创建分组名数组
NSArray *groupNameArr = [NSArray arrayWithObjects:@"O", @"X", @"Y", nil];
// for-in遍历出联系人字典的key值
for (NSString *groupName in groupNameArr) {
// 创建联系人分组数组
NSMutableArray *groupArr = [NSMutableArray array];
// 将key-value添加在联系人字典中
[self.contactDic setObject:groupArr forKey:groupName];
}
}
// 在字典中添加联系人
- (void)addContact:(Contact *)contact
{
// 姓名或电话号码为空时 不能添加
// contact.name.length == 0
// contact.name == nil
// @"" 空字符串 nil空指针 二者不相同
if (contact.name.length == 0 || contact.phone.length == 0) {
NSLog(@"姓名或电话号码不能为空");
} else {
// 通过联系人的groupName确定联系人所属的数组
NSMutableArray *arr = [self.contactDic objectForKey:contact.groupName];
// 把联系人对象添加进数组
[arr addObject:contact];
}
}
// 获取某个分组的联系人
- (NSMutableArray *)searchContactWithGroupName:(NSString *)groupName
{
// 通过groupName作为key值 找到对应的联系人数组
NSMutableArray *arr = [self.contactDic objectForKey:groupName];
// 对可变数组调用排序算法 以名字升序排列
[arr sortUsingSelector:@selector(compareNameWithContact:)];
return arr;
}
// 根据电话号搜索联系人
- (NSMutableArray *)searchContactWithPhone:(NSString *)phone
{
// 空数组用于存储搜索到的联系人对象
NSMutableArray *arr = [NSMutableArray array];
// 首先遍历的通讯录字典
for (NSString *key in self.contactDic) {
// 通过遍历到的key获取对应的联系人数组
NSMutableArray *contactArr = [self.contactDic objectForKey:key];
// 遍历联系人数组 获得联系人对象
for (Contact *c in contactArr) {
// 判断phone是否和对象的phone相同
if ([phone isEqualToString:c.phone]) {
// 将符合条件的对象加入空数组中
[arr addObject:c];
}
}
}
return arr;
}
// 获取女性联系人 按年龄倒序排列
- (NSMutableArray *)searchWomenContacts
{
// 用于存放搜索结果的空数组
NSMutableArray *arr = [NSMutableArray array];
// 遍历通讯录字典
for (NSString *key in self.contactDic) {
// 通过遍历到的key获取对应的联系人数组
NSMutableArray *contactArr = [self.contactDic objectForKey:key];
// 遍历联系人数组 获得联系人对象
for (Contact *c in contactArr) {
// 判断是否为女性
if ([c.sex isEqualToString:@"female"]) {
// 将符合条件的对象加入空数组中
[arr addObject:c];
}
}
}
// 按照名字倒序排列
[arr sortUsingSelector:@selector(compareAgeWithContact:)];
return arr;
}
// 根据名字删除某个联系人
- (void)deleteContactWithName:(NSString *)name
{
// 遍历通讯录字典
for (NSString *key in self.contactDic) {
// 定义一个临时联系人对象 用于保存要删除的联系人对象地址 (多个要删除的对象可以使用数组)
Contact *temp = [[Contact alloc] init];
// 通过遍历到的key获取对应的联系人数组
NSMutableArray *contactArr = [self.contactDic objectForKey:key];
// 遍历联系人数组 获得联系人对象
for (Contact *c in contactArr) {
// 判断名字是否相同
if ([c.name isEqualToString:name]) {
// 将符合条件的对象标记给 临时对象temp
temp = c;
}
}
// 删除对象
[contactArr removeObject:temp];
}
}
// 删除某个分组的全部联系人
- (void)deleteContactWithGroupName:(NSString *)groupName
{
// 根据分组名获取对应的联系人数组
NSMutableArray *arr = [self.contactDic objectForKey:groupName];
// 删除数组元素
[arr removeAllObjects];
}
@end
@interface AddressBook : NSObject
@property (nonatomic, retain) NSMutableDictionary *contactDic;// 用来管理联系人的字典
// 添加联系人方法
- (void)addContact:(Contact *)contact;
// 获得某个分组的联系人
- (NSMutableArray *)searchContactWithGroupName:(NSString *)groupName;
// 根据号码搜索联系人
- (NSMutableArray *)searchContactWithPhone:(NSString *)phone;
// 获取所有女性联系人
- (NSMutableArray *)searchWomenContacts;
// 根据姓名删除某个联系人
- (void)deleteContactWithName:(NSString *)name;
// 删除某个分组的全部联系人
- (void)deleteContactWithGroupName:(NSString *)groupName;
@end
// 1.创建联系人对象
Contact *xiaohuo = [Contact contactWithName:@"Xiaohuo" sex:@"male" phone:@"123456" address:@"on the earth" groupName:@"X" age:20];
Contact *yonggang = [Contact contactWithName:@"Yonggang" sex:@"male" phone:@"654321" address:@"on the seat" groupName:@"Y" age:22];
Contact *xx = [Contact contactWithName:@"Xx" sex:@"female" phone:@"110" address:@"in the class1" groupName:@"X" age:18];
Contact *oo = [Contact contactWithName:@"Oo" sex:@"female" phone:@"120" address:@"the same to xx" groupName:@"O" age:30];
NSLog(@"%@\n%@\n%@\n%@", xiaohuo, yonggang, xx, oo);
// 2.创建通讯录对象
AddressBook *book = [[AddressBook alloc] init];
// 3.把联系人添加进通讯录
[book addContact:xiaohuo];
[book addContact:yonggang];
[book addContact:xx];
[book addContact:oo];
NSLog(@"contactDic: %@", book.contactDic);
// 4.获取某个分组下所有联系人
NSMutableArray *groupArr = [book searchContactWithGroupName:@"X"];
NSLog(@"groupArr %@", groupArr);
// 5.通过电话号搜索联系人
NSMutableArray *phoneArr = [book searchContactWithPhone:@"120"];
NSLog(@"phoneArr %@", phoneArr);
// 6.获取所有女性联系人 按照年龄倒序排列
NSMutableArray *womenArr = [book searchWomenContacts];
NSLog(@"womenArr %@", womenArr);
// 7.根据名字删除对应的联系人信息
[book deleteContactWithName:@"Xx"];
NSLog(@"delete %@", book.contactDic);
// 8.删除某个分组的全部联系人
[book deleteContactWithGroupName:@"X"];
NSLog(@"deleteGroup %@", book.contactDic);
return 0;
}