一、功能描述:
main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能:
1).使用便利构造器创建四个Person类的实例(联系人).
姓名:Lucy 性别:女 电话:123 年龄:21
姓名:Joe 性别:男 电话:456 年龄:17
姓名:Baby 性别:女 电话:789 年龄:27
姓名:Linda 性别:女 电话:000 年龄:21
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.h
#import <Foundation/Foundation.h>
#import "NSString+Characters.h"
@interface Person : NSObject
{
NSString *_name;
NSString *_gender;
NSString *_groupName;
NSString *_phoneNumber;
int _age;
}
@property(nonatomic ,retain)NSString *name;
@property (nonatomic ,retain)NSString *gender;
@property(nonatomic , retain)NSString *groupName;
@property (nonatomic,assign)int age;
@property (nonatomic,retain)NSString *phoneNumber;
- (id)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(int)age;
+ (id)personWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(int)age;
- (NSString *)description;
//Person.m
#import "Person.h"
@implementation Person
- (id)initWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(int)age{
self = [super init ];
if (self) {
_name =[name retain];
_gender = [gender retain];
_phoneNumber = [phoneNumber retain];
_age = age;
_groupName = [[name firstCharacterOfString]retain ];
}
return self;
}
+ (id)personWithName:(NSString *)name gender:(NSString *)gender phoneNumber:(NSString *)phoneNumber age:(int)age{
Person * p= [[Person alloc]initWithName:name gender:gender phoneNumber:phoneNumber age:age];
return [p autorelease];
}
- (NSString *)description{
return [NSString stringWithFormat:@"姓名:%@ 性别:%@ 年龄:%d 电话:%@",_name,_gender,_age,_phoneNumber];
}
- (void)dealloc
{
[_name release];
[_gender release];
[_phoneNumber release];
[super dealloc];
NSLog(@"内存已释放");
}
@end
//AddressBook
#import <Foundation/Foundation.h>
@class Person ;
@interface AddressBook : NSObject
{
NSMutableDictionary *_allPersonDic;
}
@property(nonatomic,retain)NSMutableDictionary * allPersonDic;
- (BOOL)addPerson:(Person *)aPerson;
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
- (NSArray *)findPersonsWithSex:(NSString *)aSex;
-(BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge;
- (BOOL)deletePersonWithName:(NSString*)aPersonName;
- (BOOL)deleteGroup:(NSString *)aGroupName;
-(void)showAll;
@end
#import "AddressBook.h"
#import "Person.h"
@implementation AddressBook
- (id)init
{ self = [super init];
if (self) {
_allPersonDic = [[NSMutableDictionary alloc]init ];
}
return self ;
}
//添加联系人
- (BOOL)addPerson:(Person *)aPerson{
//如果姓名或电话为空返回NO
if ([aPerson name] == nil || [aPerson phoneNumber] == nil ) {
return NO;
}
NSMutableArray * oneGroup = [_allPersonDic objectForKey:[aPerson groupName] ];
//如果姓名重复返回NO
for (Person * p in oneGroup) {
if ([[p name] isEqualToString: [aPerson name]]) {
NSLog(@"请不要添加同姓名之人");
return NO;
}
}
//不存在创建分组后再存储
if (oneGroup == nil) {
oneGroup = [NSMutableArray array ];
[oneGroup addObject:aPerson];
[_allPersonDic setObject:oneGroup forKey: [aPerson groupName]];
//判断是否已经存在分组,存在直接存储
}else{
[oneGroup addObject:aPerson];
}
return YES;
}
//根据电话查找某个联系人
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum
{
for (NSString *groupName in _allPersonDic) {
NSMutableArray * oneGroup = [_allPersonDic objectForKey:groupName];
for (Person * p in oneGroup) {
if ([[p phoneNumber] isEqualToString:aPhoneNum]) {
return p;
}
}
}
return nil;
}
//根据姓名,更改联系人信息
- (NSArray *)findPersonsWithSex:(NSString *)aSex{
NSMutableArray * searchArray =[NSMutableArray array ];
for (NSString *groupName in _allPersonDic) {
NSMutableArray *oneGroup = [_allPersonDic objectForKey:groupName ];
for (Person * p in oneGroup) {
if ([[p gender] isEqualToString:aSex]) {
[ searchArray addObject:p ];
}
}
}
[searchArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person * p1 =(Person *)obj1;
Person * p2 =(Person *)obj2;
return [p1 age] >[p2 age];
}];
return searchArray;
}
//根据姓名,更改联系人
- (BOOL)changePersonWithName:(NSString *)name phoneNum:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge{
for (NSString *groupName in _allPersonDic) {
NSMutableArray *oneGroup = [_allPersonDic objectForKey:groupName];
for (Person * p in oneGroup) {
if ([[p name] isEqualToString:name]) {
p.phoneNumber = aNum;
p.gender = aSex;
p.age =(int) aAge;
return YES;
}
}
}
return NO;
}
//按照姓名删除联系人
- (BOOL)deletePersonWithName:(NSString*)aPersonName{
for (NSString * groupName in _allPersonDic) {
NSMutableArray *oneGroup = [_allPersonDic objectForKey:groupName];
NSMutableArray * deleteArray =[NSMutableArray array ];
for (Person * p in oneGroup) {
if ([[p name ] isEqualToString :aPersonName ]) {
[deleteArray addObject:p];
}
}
[ oneGroup removeObjectsInArray:deleteArray];
if ( oneGroup.count == 0) {
//[oneGroup removeAllObjects];
[_allPersonDic removeObjectForKey: aPersonName];
return YES;
}
}
return NO;
}
//删除一个分组
- (BOOL)deleteGroup:(NSString *)aGroupName{
for (NSString * groupName in _allPersonDic) {
if ( [ groupName isEqualToString:aGroupName ]) {
[_allPersonDic removeObjectForKey:aGroupName ];
return YES;
}
}
return NO;
}
- (void)showAll{
for (NSString * groupName in _allPersonDic) {
NSMutableArray *oneGroup = [_allPersonDic objectForKey:groupName];
for ( Person * p in oneGroup) {
NSLog(@"%@",p);
}
}
}
- (void)dealloc
{ NSLog(@"内存释放");
[_allPersonDic release];
[super dealloc ];
}
@end
//**NSString+Characters.m**
#import "NSString+Characters.h"
@implementation NSString (Characters)
//讲汉字转换为拼音
- (NSString *)pinyinOfString
{
NSMutableString * string = [[[NSMutableString alloc] initWithString:self ] autorelease];
CFRange range = CFRangeMake(0, [string length]);
// 汉字转换为拼音,并去除音调
if ( ! CFStringTransform((__bridge CFMutableStringRef) string, &range, kCFStringTransformMandarinLatin, NO) ||
! CFStringTransform((__bridge CFMutableStringRef) string, &range, kCFStringTransformStripDiacritics, NO)) {
return @"";
}
return string;
}
//汉字转换为拼音后,返回大写的首字母
- (NSString *)firstCharacterOfString
{
NSMutableString * first = [[[NSMutableString alloc] initWithString:[self substringWithRange:NSMakeRange(0, 1)]] autorelease];
CFRange range = CFRangeMake(0, 1);
// 汉字转换为拼音,并去除音调
if ( ! CFStringTransform((__bridge CFMutableStringRef) first, &range, kCFStringTransformMandarinLatin, NO) ||
! CFStringTransform((__bridge CFMutableStringRef) first, &range, kCFStringTransformStripDiacritics, NO)) {
return @"";
}
NSString * result;
result = [first substringWithRange:NSMakeRange(0, 1)];
return result.uppercaseString;
}
@end
//main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "AddressBook.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
AddressBook * book = [[AddressBook alloc]init];
Person * p1 = [Person personWithName:@"Lucy" gender:@"女" phoneNumber:@"123" age:21];
Person * p2 = [Person personWithName:@"Joe" gender:@"男" phoneNumber:@"456" age:17];
Person * p3 = [Person personWithName:@"Baby" gender:@"女" phoneNumber:@"789" age:27];
Person * p4 = [Person personWithName:@"Linda" gender:@"女" phoneNumber:@"000" age:21];
Person * p5 = [Person personWithName:@"Lucy" gender:@"女" phoneNumber:@"123" age:17];
[book addPerson:p1];
[book addPerson:p2];
[book addPerson:p3];
[book addPerson:p4];
[book addPerson:p5];
[book showAll];
NSLog(@"========");
//查找电话:456 的联系人
Person * p= [book findPersonWithPhoneNum:@"456"];
NSLog(@"%@",p);
NSLog(@"========");
//查找女联系人
NSArray *array2 = [book findPersonsWithSex:@"女"];
for (Person * p in array2) {
NSLog(@"%@",p);
}
NSLog(@"========");
//更改联系人信息
[book changePersonWithName:@"Linda" phoneNum:@"012" sex:@"女" age:25];
[book showAll];
NSLog(@"========");
//删除联系人
[book deletePersonWithName:@"Baby"];
[book showAll];
NSLog(@"========");
//删除分组
[book deleteGroup:@"L"];
[book showAll];
[book release];
}
return 0;
}