// ****** 获取姓名首字母 ********
// ****** NSString+Characters.h文件
#import
@interface NSString (Characters)
- (NSString *)charactersGroupName;
@end
// ********NSString+Characters.m文件
#import "NSString+Characters.h"
@implementation NSString (Characters)
- (NSString *)charactersGroupName
{
NSString *string = [self uppercaseString];
return [string substringToIndex:1];
}
@end
// ****** 创建一个Person类 ******
// ****** Person.h文件
#import
@interface Person : NSObject
@property(nonatomic, retain)NSString *name;
@property(nonatomic, assign)int age;
@property(nonatomic, retain)NSString *sex;
@property(nonatomic, retain)NSString *num;
@property(nonatomic, retain)NSString *groupName;
- (instancetype)initWithName:(NSString *)name // 重写初始化
Age:(int)age
Sex:(NSString *)sex
Num:(NSString *)num;
+ (instancetype)personWithName:(NSString *)name // 便利构造器
Age:(int)age
Sex:(NSString *)sex
Num:(NSString *)num;
- (void)description; // 重写description方法
@end
// ****** Person.m文件
#import "Person.h"
#import "NSString+Characters.h"
@implementation Person
- (instancetype)initWithName:(NSString *)name
Age:(int)age
Sex:(NSString *)sex
Num:(NSString *)num
{
_name = name;
_age = age;
_sex = sex;
_num = num;
_groupName = [name charactersGroupName]; // 通过姓名得到组名
return self;
}
+ (instancetype)personWithName:(NSString *)name
Age:(int)age
Sex:(NSString *)sex
Num:(NSString *)num
{
Person *p = [[[Person alloc] initWithName:name Age:age Sex:sex Num:num] autorelease];
return p;
}
- (void)description
{
NSLog(@"姓名:%@ 年龄:%d 性别:%@ 号码:%@ 分组:%@",self.name,self.age,self.sex,self.num,self.groupName);
}
- (void)dealloc // 重写dealloc方法
{
[_name release];
[_sex release];
[_num release];
[_groupName release];
[super dealloc];
}
@end
// ****** 通讯录功能实现 ******
// ****** AddressBook.h文件
#import
@class Person;
@interface AddressBook : NSObject
@property(nonatomic, retain)NSMutableDictionary *allPersonDic;
- (instancetype)init;
+ (instancetype)addressBook;
// 3.)添加联系人
- (BOOL)addPerson:(Person *)aPerson;
// 4.)根据号码查找联系人
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
// 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序
- (NSArray *)findPersonsWithSex:(NSString *)aSex;
// 6.)根据姓名,更改联系人信息
- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(int) aAge;
// 7.)按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
// 8.)删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName;
// 9.)展示通讯录中的所有联系人信息
- (void)showAll;
@end
// ****** AddressBook.m文件
#import "AddressBook.h"
#import "Person.h"
#import "NSString+Characters.h"
@implementation AddressBook
- (instancetype)init
{
self = [super init];
if (self) {
self.allPersonDic = [NSMutableDictionary dictionary];
}
return self;
}
+ (instancetype)addressBook
{
AddressBook *add = [[[AddressBook alloc] init] autorelease];
return add;
}
- (void)dealloc
{
[_allPersonDic release];
[super dealloc];
}
// 3.)添加联系人
- (BOOL)addPerson:(Person *)aPerson
{
// 判断姓名、电话是否为空,分组是否存在
BOOL isNameNil = aPerson.name == nil;
BOOL isNumNil = aPerson.num == nil;
BOOL isGroupExist = [[_allPersonDic allKeys] containsObject:aPerson.groupName];
// 当姓名、电话不为空,分组存在时
if (!isNameNil && !isNumNil && isGroupExist) {
// 遍历字典,找到对应的组
for (NSString *key in _allPersonDic) {
NSMutableArray *array = _allPersonDic[key];
if ([key isEqualToString:aPerson.groupName]) {
// 遍历组,判断是否重名
for (Person *p in array) {
if (p.name == aPerson.name) {
NSLog(@"此联系人已存在,添加失败!!!");
return NO;
}
}
// 遍历之外添加联系人
NSLog(@"添加成功");
[array addObject:aPerson];
return YES;
}
}
}else if (!isNameNil && !isNumNil) { // 当分组不存在时,创建分组
[_allPersonDic setValue:[NSMutableArray arrayWithObject:aPerson] forKey:aPerson.groupName];
NSLog(@"添加成功");
return YES;
}else {
NSLog(@"添加失败!!!姓名或号码不能为空!!!");
return NO;
}
return NO;
}
// 4.)根据号码查找联系人
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum
{
Person *per = nil;
for (NSArray *array in [_allPersonDic allValues]) {
for (Person *p in array) {
if (p.num == aPhoneNum) {
per = p;
return per;
}
}
}
NSLog(@"没有该联系人");
return per;
}
// 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序
- (NSArray *)findPersonsWithSex:(NSString *)aSex
{
NSMutableArray *nma = [NSMutableArray array];
for (NSArray *array in [_allPersonDic allValues]) {
for (Person *p in array) {
if (p.sex == aSex) {
[nma addObject:p];
}
}
}
NSComparator comSex = ^(Person *p1, Person *p2){
if (p1.age > p2.age) {return NSOrderedDescending;}
else if(p1.age < p2.age){return NSOrderedAscending;}
else {return NSOrderedSame;}
};
NSArray *arr = [nma sortedArrayUsingComparator:comSex];
return arr;
}
// 6.)根据姓名,更改联系人信息
- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(int) aAge
{
// 根据姓名找到联系人
for (NSArray *arr in [_allPersonDic allValues]) {
for (Person *p in arr) {
if ([p.name isEqualToString:name]) {
[p setName:name];
[p setNum:aNum];
[p setSex:aSex];
[p setAge:aAge];
[p setGroupName:[name charactersGroupName]];
NSLog(@"修改成功");
return YES;
}
}
}
NSLog(@"修改失败,没有此联系人");
return NO;
}
// 7.)按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName
{
for (NSMutableArray *arr in [_allPersonDic allValues]) {
for (Person *p in arr) {
if ([p.name isEqualToString:aPersonName]) {
[arr removeObject:p];
NSLog(@"删除成功");
return YES;
}
}
}
NSLog(@"删除失败");
return NO;
}
// 8.)删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName
{
for (NSString *key in _allPersonDic) {
if ([key isEqualToString:aGroupName]) {
[_allPersonDic removeObjectForKey:aGroupName];
NSLog(@"分组删除成功");
return YES;
}
}
NSLog(@"该分组不存在");
return NO;
}
// 9.)展示通讯录中的所有联系人信息
- (void)showAll
{
for (NSArray *arr in [_allPersonDic allValues]) {
for (Person *p in arr) {
[p description];
}
}
}
@end
// ****** main.m文件 ******
#import
#import "NSString+Characters.h"
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能:
1).使用便利构造器创建四个Person类的实例(联系人).
姓名:Lucy 性别:女 电话:123 年龄:21
姓名:Joe 性别:男 电话:456 年龄:17
姓名:Baby 性别:女 电话:789 年龄:27
姓名:Linda 性别:女 电话:000 年龄:20
2).创建一个AddressBook类的实例对象(通讯录).
3).使用AddressBook类中定义的方法实现:添加联系人,将四个联系人添加到通讯录中.
4).使用AddressBook类中定义的方法实现:根据电话查找联系人,并打印(查找电话:456);
5).使用AddressBook类中定义的方法实现:根据性别查找联系人,并将查到的联系人按照年龄升序排序,并打印(查找性别:女)
6).使用AddressBook类中定义的方法实现:根据姓名,更改联系人信息.(修改Linda的信息: 性别:女 电话:012 年龄:25);
7).使用AddressBook类中定义的方法实现:按照姓名删除联系人,并展示通信录中所有人信息.(删除联系人:Baby)
8).使用AddressBook类中定义的方法实现:删除一个分组,并展示通信录中所有人信息.(删除L组)
9).使用AddressBook类中定义的方法实现:实现3~8之间每个功能后,输出通讯录中所有联系人信息。
*/
Person *p1 = [Person personWithName:@"Lucy" Age:21 Sex:@"女" Num:@"123"];
Person *p2 = [Person personWithName:@"Joe" Age:17 Sex:@"男" Num:@"456"];
Person *p3 = [Person personWithName:@"Nany" Age:27 Sex:@"女" Num:@"798"];
Person *p4 = [Person personWithName:@"Linda" Age:20 Sex:@"女" Num:@"000"];
[p1 description];
AddressBook *add = [AddressBook addressBook];
// 3.)添加联系人
NSLog(@"============= 添加联系人 ==============");
[add addPerson:p1];
[add addPerson:p2];
[add addPerson:p3];
[add addPerson:p4];
[add addPerson:p1];
NSLog(@"======================================");
// 4.)根据电话查找某个联系人
NSLog(@"========== 根据姓名查找联系人 ===========");
[[add findPersonWithPhoneNum:@"123"] description];
NSLog(@"======================================");
// 5.)根据性别查找联系人,并将查到的联系人按照年龄升序排序
NSLog(@"========== 根据性别查找联系人 ===========");
NSArray *arr = [add findPersonsWithSex:@"女"];
for (int i = 0; i
[arr[i] description];
}
NSLog(@"======================================");
// 6.)根据姓名,更改联系人信息
NSLog(@"=========== 更改联系人信息 =============");
[add changePersonWithName:@"Lucy" phoneNum:@"666" sex:@"男" age:61];
[[add findPersonWithPhoneNum:@"666"] description];
NSLog(@"======================================");
// 7.)按照姓名删除联系人
NSLog(@"========== 按照姓名删除联系人 ===========");
[add deletePersonWithName:@"Linda"];
NSLog(@"======================================");
// 8.)删除一个分组
NSLog(@"============ 删除一个分组 ==============");
[add deleteGroup:@"L"];
NSLog(@"======================================");
// 9.)展示通讯录中的所有联系人信息
NSLog(@"====== 展示通讯录中的所有联系人信息 =======");
[add showAll];
}
return 0;
}