(注:使用MRC)
一、功能描述:
main函數(shù)中通過使用Person類和AddressBook類俯在,創(chuàng)建對(duì)象粒督、調(diào)用方法,實(shí)現(xiàn)以下8個(gè)功能:
1).使用便利構(gòu)造器創(chuàng)建四個(gè)Person類的實(shí)例(聯(lián)系人).
姓名:Lucy 性別:女 電話:123 年齡:21
姓名:Joe 性別:男 電話:456 年齡:17
姓名:Baby 性別:女 電話:789 年齡:27
姓名:Linda 性別:女 電話:000 年齡:21
2).創(chuàng)建一個(gè)AddressBook類的實(shí)例對(duì)象(通訊錄).
3).使用AddressBook類中定義的方法實(shí)現(xiàn):添加聯(lián)系人,將四個(gè)聯(lián)系人添加到通訊錄中.
4).使用AddressBook類中定義的方法實(shí)現(xiàn):根據(jù)電話查找聯(lián)系人,并打印(查找電話:456);
5).使用AddressBook類中定義的方法實(shí)現(xiàn):根據(jù)性別查找聯(lián)系人,并將查到的聯(lián)系人按照年齡升序排序,并打印(查找性別:女)
6).使用AddressBook類中定義的方法實(shí)現(xiàn):根據(jù)姓名,更改聯(lián)系人信息.(修改Linda的信息: 性別:女 電話:012 年齡:25);
7).使用AddressBook類中定義的方法實(shí)現(xiàn):按照姓名刪除聯(lián)系人,并展示通信錄中所有人信息.(刪除聯(lián)系人:Baby)
8).使用AddressBook類中定義的方法實(shí)現(xiàn):刪除一個(gè)分組,并展示通信錄中所有人信息.(刪除L組)
9).使用AddressBook類中定義的方法實(shí)現(xiàn):實(shí)現(xiàn)3~8之間每個(gè)功能后牙丽,輸出通訊錄中所有聯(lián)系人信息简卧。
二、功能實(shí)現(xiàn)提示:
1烤芦、功能一
定義Person類
1)聲明屬性:姓名,年齡,性別,電話,分組举娩。注:年齡是int類型,其余屬性時(shí)NSString類型构罗;分組是姓名首字母(大寫)铜涉,使用提供的類目:NSString+Characters中的方法獲取。(3分)
2)重寫description方法遂唧,輸出Person對(duì)象的信息芙代。例如: “姓名:張三 性別:男 年齡:22 電話:123456789”.(2分)
3)定義Person類的便利構(gòu)造器方法,方法包含參數(shù):姓名盖彭、年齡纹烹、性別事甜、電話.(5分)
2、功能二
定義AddressBook類.
1)聲明屬性:allPersonDic(字典類型)滔韵。使用聲明的字典作為容器逻谦,分組管理通訊錄中所有聯(lián)系人;字典的Key值為分組名(姓名首字母陪蜻,大寫),value值為數(shù)組,數(shù)組中存放聯(lián)系人(Person實(shí)例).(5分)
2)在AddressBook的初始化方法中邦马,初始化allPersonDic。(5分)
3)重寫dealloc方法宴卖,在dealloc方法中實(shí)現(xiàn)AddressBook類的內(nèi)存管理滋将。(5分)
3、功能三
添加聯(lián)系人.要求(15分)
a.在AddressBook類中定義方法:
- (BOOL)addPerson:(Person *)aPerson;
b.判斷姓名和電話不能為空否則添加失敗.
c.判斷是否已經(jīng)存在分組,存在直接存儲(chǔ).不存在創(chuàng)建分組后再存儲(chǔ).(注:聯(lián)系人不能有重名).
d.添加成功返回YES,姓名為空或者有重名的添加失敗返回NO.
e.數(shù)據(jù)使用Person存儲(chǔ).
4症昏、功能四
根據(jù)電話查找某個(gè)聯(lián)系人.(10分)
a:在AddressBook類中定義方法:
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
b:如果找到返回該聯(lián)系人,否則返回nil.
c.忽略電話重復(fù)問題随闽,只返回第一個(gè)查找到的聯(lián)系人。
5肝谭、功能五
根據(jù)性別查找聯(lián)系人,并將查到的聯(lián)系人按照年齡升序排序(15分)
a:在AddressBook類中定義方法:
-(NSArray *)findPersonsWithSex:(NSString *)aSex;
b:查找到聯(lián)系人放入數(shù)組,排序的時(shí)候使用block.
6掘宪、功能六
根據(jù)姓名,更改聯(lián)系人信息.(10分)
a:在AddressBook類中定義方法:
-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;
b:找到該聯(lián)系人并修改該成功返回YES,否則返回NO
c.修改電話、性別攘烛、年齡魏滚,參數(shù)不能為空。
7坟漱、功能七
按照姓名刪除聯(lián)系人.(15分)
a.在AddressBook類中定義方法:
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
b.刪除成功返回YES,否則返回NO;
c.當(dāng)刪除聯(lián)系人后分組為空時(shí)鼠次,需要?jiǎng)h除該分組。
8芋齿、功能八
刪除一個(gè)分組.(5分)
a.在AddressBook類中定義方法:
- (BOOL)deleteGroup:(NSString *)aGroupName;
b.刪除成功返回YES,否則返回NO;
9腥寇、功能九
展示通訊錄中的所有聯(lián)系人信息(5分)
a:在AddressBook類中定義方法:
-(void)showAll;
b.通過重寫description方法展示聯(lián)系人信息 。
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
//一觅捆、定義聯(lián)系人類Person
//實(shí)例變量:姓名赦役、性別、電話號(hào)碼惠拭、住址扩劝、分組名稱庸论。
//方法:初始化方法(姓名职辅、電話號(hào)碼)、顯示聯(lián)系人信息
@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;
// 便利構(gòu)造器
+ (instancetype)personWithName:(NSString *)name
sex:(NSString *)sex
phoneNum:(NSString *)phoneNum
age:(int)age;
@end
Person.m
#import "Person.h"
@implementation Person
//Person類的實(shí)現(xiàn):1.初始化方法 2.重寫description函數(shù)
- (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;
}
// 便利構(gòu)造器
+ (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 <Foundation/Foundation.h>
#import "NSString+Character.h"
@class Person;
//AddressBook類的聲明:
/*
1.重寫init方法,初始化字典
2.可以添加新聯(lián)系人對(duì)象
3.根據(jù)姓名刪除聯(lián)系人
4.刪除某分組的所有聯(lián)系人
5.根據(jù)電話號(hào)碼搜索聯(lián)系人
6.獲取所有某性聯(lián)系人聂示,并將查到的聯(lián)系人按照年齡升序排序
7.根據(jù)姓名域携,更改聯(lián)系人信息
8.展示通訊錄中的所以聯(lián)系人信息
*/
@interface AddressBook : NSObject
//創(chuàng)建一個(gè)字典存儲(chǔ)數(shù)據(jù)
@property(nonatomic,retain)NSMutableDictionary *dic;
//1.重寫init方法,初始化字典
- (id)initWithMutableDic:(NSMutableDictionary *)dic;
//2.可以添加新聯(lián)系人對(duì)象
- (BOOL)addPerson:(Person *)aPerson;
//3.根據(jù)姓名刪除聯(lián)系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
//4.刪除某分組的所有聯(lián)系人
- (BOOL)deleteGroup:(NSString *)aGroupName;
//5.根據(jù)電話號(hào)碼搜索聯(lián)系人
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
//6.獲取所有某性聯(lián)系人,并將查到的聯(lián)系人按照年齡升序排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex;
//7.根據(jù)姓名鱼喉,更改聯(lián)系人信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(int) aAge;
//8.展示通訊錄中的所以聯(lián)系人信息
-(void)showAll;
@end
AddressBook.m
#import "AddressBook.h"
#import "Person.h"
@implementation AddressBook
//1.重寫init方法,初始化字典
//- (instancetype)init{
// self = [super init];
// _dic = [NSMutableDictionary dictionaryWithCapacity:1];//創(chuàng)建一個(gè)可變?cè)~典初始指定它的長(zhǎng)度為1.秀鞭,動(dòng)態(tài)的添加數(shù)據(jù)如果超過1這個(gè)詞典長(zhǎng)度會(huì)自動(dòng)增加趋观,所以不用擔(dān)心數(shù)組越界。
// 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.可以添加新聯(lián)系人對(duì)象
- (BOOL)addPerson:(Person *)aPerson{
BOOL isAdd = NO;
if ((aPerson.name == nil || aPerson.phoneNum == nil ) || ([aPerson.name isEqualToString:@""] || [aPerson.phoneNum isEqualToString:@""])) {
NSLog(@"信息不完整锋边,添加失敗");
return isAdd;
}
//獲取名字的首字母皱坛,并且大寫。當(dāng)作字典的key(鍵)
NSString *key = [aPerson.name uppercaseFirstLetter];
//通過鍵來查找數(shù)組
NSMutableArray *tempArray = [_dic objectForKey:key];
if (! tempArray) {
//給數(shù)組分配空間
tempArray = [[[NSMutableArray alloc]init]autorelease];
//創(chuàng)建鍵值對(duì)
[_dic setObject:tempArray forKey:key];
}
//檢查一下是否有重名的
for (int i = 0; i < [tempArray count]; i ++) {
if ([aPerson.name isEqualToString:[tempArray[i] name]]) {
NSLog(@"有重名的,添加失敗");
return isAdd;
}
}
//把聯(lián)系人加進(jìn)創(chuàng)建好的數(shù)組里面
[tempArray addObject:aPerson];
isAdd = YES;
return isAdd;
}
//3.根據(jù)姓名刪除聯(lián)系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName{
for (NSString *key in _dic) {
NSMutableArray *tempArray = [_dic objectForKey:key];
//遍歷數(shù)組
for (Person *person in tempArray) {
if ([person.name isEqualToString:aPersonName]) {
[tempArray removeObject:person];
NSLog(@"找到要?jiǎng)h除的人了");
//如果這個(gè)人豆巨,是分組里面最后一個(gè)剩辟,就把分組也刪除
if ([tempArray count] == 0) {
//在字典里面刪除鍵值對(duì)
[_dic removeObjectForKey:key];
NSLog(@"數(shù)組已經(jīng)被刪除");
}
return YES;
}
}
}
NSLog(@"沒有找到");
return NO;
}
//4.刪除某分組的所有聯(lián)系人
- (BOOL)deleteGroup:(NSString *)aGroupName{
//先判斷,有么有這個(gè)分組
for (NSString *key in _dic) {
if ([key isEqualToString:aGroupName]) {
//先通過傳進(jìn)來的鍵往扔,來獲取字典里面的值(數(shù)組)
NSMutableArray *tempArray = [_dic objectForKey:aGroupName];
//刪完這個(gè)數(shù)組里面的所有元素
[tempArray removeAllObjects];
//刪除字典里面的鍵值對(duì),通過鍵來刪除
[_dic removeObjectForKey:aGroupName];
NSLog(@"找到分組贩猎,刪除成功");
return YES;
}
}
NSLog(@"沒有這個(gè)分組");
return NO;
}
//5.根據(jù)電話號(hào)碼搜索聯(lián)系人
-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum{
//第一步,把字典里面的鍵拿出來,通過鍵來取值
for (NSString *key in _dic) {
//通過objectForKey: 這個(gè)方法萍膛,把字典里面的數(shù)組拿出來
NSMutableArray *tempArray = [_dic objectForKey:key];
//遍歷拿出來的數(shù)組吭服,讓數(shù)組里面每一個(gè)人的號(hào)碼,和 形參的值進(jìn)行比較蝗罗。
for (Person *p in tempArray) {
if ([p.phoneNum isEqualToString:aPhoneNum]) {
NSLog(@"人找到了");
NSLog(@"%@",p);
return p;
}
}
}
NSLog(@"沒有找到該聯(lián)系人");
return nil;
}
//6.獲取所有某性聯(lián)系人艇棕,并將查到的聯(lián)系人按照年齡升序排序
-(NSArray *)findPersonsWithSex:(NSString *)aSex{
//聲明數(shù)組,用來儲(chǔ)存性別相同的人
NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
//然后再開始串塑,遍歷字典欠肾,拿到鍵值,遍歷數(shù)組
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.根據(jù)姓名拟赊,更改聯(lián)系人信息
-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(int)aAge{
//第一步刺桃,先遍歷
for (NSString *key in _dic) {
//通過key來取值
NSMutableArray *tempArray = [_dic objectForKey:key];
//開始遍歷數(shù)組
for (Person *person in tempArray) {
if ([person.name isEqualToString:name]) {
//找到人后,開始修改吸祟,把傳進(jìn)來的新的信息賦值給這個(gè)人
person.phoneNum = aNum;
person.sex = aSex;
person.age = aAge;
NSLog(@"賦值成功");
NSLog(@"%@",person);
return YES;
}
}
}
return NO;
}
//8.展示通訊錄中的所有聯(lián)系人信息
-(void)showAll{
NSLog(@"%@",_dic);
}
@end
NSString+Character.h
#import <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1.創(chuàng)建一個(gè)AdderssBook類的實(shí)例
AddressBook *book = [[AddressBook alloc]initWithMutableDic:[NSMutableDictionary dictionary]];
// 2.使用便利構(gòu)造器創(chuàng)建四個(gè)Person的實(shí)例
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.調(diào)用添加聯(lián)系人的方法瑟慈,將四個(gè)聯(lián)系人添加到通訊錄中
[book addPerson:person1];
[book addPerson:person2];
[book addPerson:person3];
[book addPerson:person4];
[book addPerson:person5];
[book showAll];
// 4.根據(jù)電話查找聯(lián)系人,并打游葚啊(查找電話:456)
[book findPersonWithPhoneNum:@"456"];
// 5.根據(jù)性別查找聯(lián)系人葛碧,并將查找的聯(lián)系人按照年齡的升序排序,并打庸恰(查找性別:女)
[book findPersonsWithSex:@"女"];
// 6.根據(jù)姓名进泼,更改聯(lián)系人信息。(修改Linda的信息:性別:女電話:012年齡:25)
[book changePersonWithName:@"Linda" phoneNum:@"012" sex:@"女" age:25];
// 7.按照姓名刪除聯(lián)系人纤虽,并展示通訊錄中所有的人信息(刪除聯(lián)系人:Baby)
[book deletePersonWithName:@"Boby"];
// 8.刪除一個(gè)分組乳绕,并展示通訊錄中所有的人。(刪除L組)
[book deleteGroup:@"L"];
[book autorelease];
}
return 0;
}