1. 程式人生 > >ObjectC----實現簡單的通訊錄(增刪改查)

ObjectC----實現簡單的通訊錄(增刪改查)

經過兩天的低迷,狀態在慢慢的迴歸了,生活還要繼續,人生還需奮鬥!

祝:好人一生平安!!!

========================================================================

題目描述:

1.建立AddressBook類. 1)使⽤用字典作為容器,字典的Key值為分組名(姓名⾸首字⺟母,⼤大寫),value值為陣列,陣列

中存放聯絡⼈人(Person例項).(5分) 2)新增聯絡⼈人.要求(20分)
不能有重名).
a.判斷姓名和電話不能為空否則新增失敗. b.判斷是否已經存在分組,存在直接儲存.不存在建立分組後再儲存.(注:聯絡⼈人
c.新增成功返回YES,姓名為空或者有重名的新增失敗返回NO. d.資料使⽤用Person儲存.
e.⽅方法:- (BOOL)addPerson:(Person *)aPerson;
3)按照姓名刪除聯絡⼈人.(15分)
a.⽅方法:- (BOOL)deletePersonWithName:(NSString*)aPersonName; b.刪除成功返回YES,否則返回NO; c.當刪除聯絡⼈人後分組為空時,需要刪除該分組。
4)刪除⼀一個分組.(10分)
a:⽅方法:- (BOOL)deleteGroup:(NSString *)aGroupName; b.刪除成功返回YES,否則返回NO;
5)根據電話查詢某個聯絡⼈人.(10分)
a:⽅方法:-(Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum; b:如果找到返回該聯絡⼈人,否則返回nil. c.忽略電話重複問題,只返回第⼀一個查詢到的聯絡⼈人。
6)根據性別查詢聯絡⼈人,並將查到的聯絡⼈人按照年齡升序排序(15分) a:⽅方法:-(NSArray *)findPersonsWithSex:(NSString *)aSex; b:查詢到聯絡⼈人放⼊入陣列,排序的時候使⽤用block.
7)根據姓名,更改聯絡⼈人資訊.(10分) a:⽅方法:-(BOOL)changePersonWithName:(NSString *)name phoneNum:
(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger) aAge; b:找到該聯絡⼈人並修改該成功返回YES,否則返回NO
c.修改電話、性別、年齡,引數不能為空。
8)展⽰示通訊錄中的所有聯絡⼈人資訊(5分) a:⽅方法:-(void)showAll;
b.通過重寫description⽅方法展⽰示聯絡⼈人資訊 。
2.使⽤用Person類.(屬性:姓名,年齡,性別,電話,分組) 1)分組是姓名⾸首字⺟母(⼤大寫),使⽤用提供的NSString類⺫⽬目中的⽅方法獲取。 2)重寫description⽅方法,輸出“姓名:張三 性別:男 年齡:22 電話:
123456789”.(5分) 3)定義Person類的便利構造器⽅方法,⽅方法包含引數:姓名、年齡、性別、電話.(5分)
3.main函式中的實現 1).建立⼀一個AddressBook類的例項(通訊錄).
2).使⽤用便利構造器建立四個Person類的例項(聯絡⼈人). 姓名:Lucy 性別:⼥女 電話:123 年齡:21
姓名:Joe 性別:男 電話:456 年齡:17
姓名:Baby 性別:⼥女 電話:789 年齡:27

姓名:Linda 性別:⼥女 電話:000 年齡:21 3).調⽤用新增聯絡⼈人⽅方法,將四個聯絡⼈人新增到通訊錄中.
 4).根據電話查詢聯絡⼈人,並列印(查詢電話:456); 5).根據性別查詢聯絡⼈人,並將查到的聯絡⼈人按照年齡升序排序,並列印(查詢性別:⼥女) 6).根據姓名,更改聯絡⼈人資訊.(修改Linda的資訊: 性別:⼥女 電話:012 年齡:25); 7).按照姓名刪除聯絡⼈人,並展⽰示通訊錄中所有⼈人資訊.(刪除聯絡⼈人:Baby) 8).刪除⼀一個分組,並展⽰示通訊錄中所有⼈人資訊.(刪除L組)

=========================================================================

AddressBook.h:

<span style="font-size:18px;">- (BOOL)addPerson:(Person *)aPerson;
- (BOOL)isGroupExist:(NSString *)groupName;
- (Person *)selectPersonWithName:(NSString *)name;
- (BOOL)deletePersonWithName:(NSString *)aPersonName;
- (BOOL)deleteGroup:(NSString *)aGroupName;
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum;
- (NSArray *)findPersonsWithSex:(NSString *)aSex;
- (BOOL)changePersonWithName:(NSString *)name phone:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger)aAge;
- (void)showAll;</span>
AddressBook.m:
<span style="color:#333333;"><span style="font-size: 18px;">// 根據姓名查詢對應的人
</span><span style="font-size:18px;">- (Person *)selectPersonWithName:(NSString *)name
{
    NSString * grup = [name uppercasePinYinFirstLetter];
    BOOL  isGupExist = [self isGroupExist:grup];
    if (!isGupExist) {
        return nil;
    }
    else{
        NSMutableArray * arr = [_dic objectForKey:grup];
        for (Person * per in arr) {
            if ([per.name isEqualToString:name]) {
                return per;
            }
        }
    }
    return nil;
}



// 判斷是否存在guoupName組
- (BOOL)isGroupExist:(NSString *)groupName
{
    for (NSString * key in _dic) {
        if ([key isEqualToString:groupName]) {
            return YES;
        }
    }
    return NO;
}

// 新增聯絡人
- (BOOL)addPerson:(Person *)aPerson
{
    Person * per = [self selectPersonWithName:aPerson.name];
    if (per) {
        NSLog(@"The Person is  Exist!");
        return NO;
    }
    BOOL isGroupExt = [self isGroupExist:aPerson.group];
    if (!isGroupExt) {
        NSMutableArray *arr = [NSMutableArray array];
        [_dic setObject:arr forKey:aPerson.group];
        [arr addObject:aPerson];
    }
    else{
        NSMutableArray * arr = [_dic objectForKey:aPerson.group];
        [arr addObject:aPerson];
    }
    return YES;
}
// 按照姓名刪除聯絡人
- (BOOL)deletePersonWithName:(NSString *)aPersonName
{
    Person * per = [self selectPersonWithName:aPersonName];
    if (per == nil) {
        NSLog(@"The Person Is Not Exist!");
        return NO;
    }
    NSMutableArray *arr = [_dic objectForKey:per.group];
    [arr removeObject:per];
    if (arr == nil) { // [arr count]==0
        [_dic removeObjectForKey:per.group];
    }
    return YES;
}
// 刪除一個分組
- (BOOL)deleteGroup:(NSString *)aGroupName
{
    BOOL isGroubExt = [self isGroupExist:aGroupName];
    if (!isGroubExt) {
        NSLog(@"The Group Is Not Exist!");
        return NO;
    }
    [_dic removeObjectForKey:aGroupName];
    return YES;
}
// 根據電話查詢某個聯絡人
- (Person *)findPersonWithPhoneNum:(NSString *)aPhoneNum
{
    for (NSString * key in _dic) {
        NSMutableArray * arr = [_dic objectForKey:key];
        for (Person * per in arr) {
            if ([per.phone isEqualToString:aPhoneNum]) {
                return per;
            }
        }
    }
    return nil;
}
// 根據性別查詢聯絡人,並將查到的聯絡人按照年齡的升序排序
- (NSArray *)findPersonsWithSex:(NSString *)aSex
{
    NSMutableArray * result = [NSMutableArray array];
    for (NSString *key in _dic) {
        NSMutableArray *arr = [_dic objectForKey:key];
        for (Person *per in arr) {
            if ([per.sex isEqualToString:aSex]) {
                [result addObject:per];
            }
        }
    }
    NSArray * arr1 = [result sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
        if (obj1.age > obj2.age) {
            return NSOrderedDescending;
        }
        else if(obj1.age == obj2.age)
        {
            return NSOrderedSame;
        }
        else
            return NSOrderedAscending;
    }];
    return arr1;
}
// 根據姓名,更改練習人資訊
- (BOOL)changePersonWithName:(NSString *)name phone:(NSString *)aNum sex:(NSString *)aSex age:(NSUInteger)aAge
{
    Person *per = [self selectPersonWithName:name];
    if (!per) {
        NSLog(@"NO Person!");
        return NO;
    }
    
    
        per.name = name;
        per.phone = aNum;
        per.sex = aSex;
        per.age = aAge;
    
    return YES;
}
// 展示通訊錄中的所有聯絡人資訊
- (void)showAll
{
    for (NSString *key in _dic) {
        NSMutableArray * arr = [_dic objectForKey:key];
        for (Person *per in arr) {
            NSLog(@"%@",per);
        }
    }
}

- (void)dealloc
{
    [_dic release];
    [super dealloc];
}

// 單獨給NSMutableDictiona型別的dic分配空間</span></span>
<span style="color:#333333;"><span style="font-size:18px;">// 也可在主函式中單獨給dic分配NSMutableDictionary空間,這裡就沒用重定義了
- (instancetype)init
{
    self = [super init];
    if (self) {
        _dic = [[NSMutableDictionary alloc]init];
    }
    return self;
}</span><span style="font-size: 18px;">
</span></span>
這裡用到了一個uppercasePinYinFirstLetter方法,用來取出NSString型別字串的首字母並把它轉化為大寫,這是在NSString的分類(類目)中實現的。

我定義的分類是NSString+firstCapitalLetter,把這個類目當做模板來用,別的工程把該類目考入能直接用。

NSString+firstCapitalLetter.h中實現

<span style="font-size:18px;">#import <Foundation/Foundation.h>
#define ALPHA	@"ABCDEFGHIJKLMNOPQRSTUVWXYZ#"
char pinyinFirstLetter(unsigned short hanzi);
@interface NSString (firstCapitalLetter)
// 提供首字母大寫
- (NSString *) uppercasePinYinFirstLetter;
- (NSString *) lowercasePinYinFirstLetter;
@end</span>
NSString+firstCapitalLetter.m
#import "NSString+firstCapitalLetter.h"

#define HANZI_START 19968
#define HANZI_COUNT 20902
static char firstLetterArray[HANZI_COUNT] =
"ydkqsxnwzssxjbymgcczqpssqbycdscdqldylybssjgyqzjjfgcclzznwdwzjljpfyynnjjtmynzwzhflzppqhgccyynmjqyxxgd";
char pinyinFirstLetter(unsigned short hanzi)
{
	int index = hanzi - HANZI_START;
	if (index >= 0 && index <= HANZI_COUNT)
	{
		return firstLetterArray[index];
	}
	else
	{
		return hanzi;
	}
}

@implementation NSString(firstCapitalLetter)

- (NSString *) uppercasePinYinFirstLetter
{
    unichar firstLetter = [self characterAtIndex:0];
    char cFirstLetter = pinyinFirstLetter(firstLetter);
    return [[NSString stringWithFormat:@"%c",cFirstLetter] uppercaseString];
}
- (NSString *) lowercasePinYinFirstLetter
{
    unichar firstLetter = [self characterAtIndex:0];
    char cFirstLetter = pinyinFirstLetter(firstLetter);
    return [[NSString stringWithFormat:@"%c",cFirstLetter] lowercaseString];
}

@end

模板用就行安靜

==============================================
Person.h安靜
<span style="font-size:14px;">@property(nonatomic,copy)NSString * name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,copy) NSString * sex;
@property(nonatomic,copy)NSString * phone;
@property(nonatomic,copy)NSString * group;

// person的便利構造器
+ (instancetype)personWithName:(NSString *)name
                           age:(NSInteger)age
                           sex:(NSString *)sex
                         phone:(NSString *)phone;

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex phone:(NSString *)phone;</span>
Person.m委屈
- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
    self.group = [name uppercasePinYinFirstLetter];

}
快哭了最近事情有些多,有些傷心
- (NSString *)description
{
    return [NSString stringWithFormat:@"name=%@,age=%ld,sex=%@,phone=%@",_name,_age,_sex,_phone];
}
//
+ (instancetype)personWithName:(NSString *)name
                           age:(NSInteger)age
                           sex:(NSString *)sex
                         phone:(NSString *)phone
{
    Person * per = [[Person alloc]initWithName:name age:age sex:sex phone:phone];
    return [per autorelease];
    
}

//
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex phone:(NSString *)phone
{
    if (self = [super init]) {
        self.name  = name;
        self.age   = age;
        self.sex   = sex;
        self.phone = phone;
        //=================
        self.group = [name uppercasePinYinFirstLetter];
    }
    return self;
    
}
=================================================================
委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈委屈
// 此句只能給AddressBook中的dic分配了一個指標的空間大小
    AddressBook * addressBook = [[AddressBook alloc]init];
    // 單獨給NSMutableDictionary型別的dic分配空間
    // 如果不使用AddressBook.m的init方法則用這一句就可以替代它
    addressBook.dic = [[NSMutableDictionary alloc] init];
   
    
    Person * per1 = [Person personWithName:@"Lucy" age:21 sex:@"女" phone:@"123"];
    Person * per2 = [Person personWithName:@"Joe" age:17 sex:@"男" phone:@"456"];

    Person * per3 = [Person personWithName:@"Baby" age:27 sex:@"女" phone:@"789"];
    
    Person * per4 = [Person personWithName:@"Linda" age:21 sex:@"女" phone:@"000"];
    //========================
    [addressBook addPerson:per1];
    [addressBook addPerson:per2];
    [addressBook addPerson:per3];
    [addressBook addPerson:per4];
    [addressBook showAll];
    //========================
    Person * p = [addressBook findPersonWithPhoneNum:@"456"];
    if (!p) {
        NSLog(@"NULL!");
    }
    else{
    NSLog(@"%@",p);
    }
     //========================
    
    NSArray * arr = [addressBook findPersonsWithSex:@"女"];
    NSLog(@"%@",arr);
    //========================
    [addressBook changePersonWithName:@"Linda" phone:@"012" sex:@"女" age:25];
    NSLog(@"%@",[addressBook selectPersonWithName:@"Linda"]);
    //========================
    [addressBook deletePersonWithName:@"Baby"];
    [addressBook showAll];
//    //========================
    [addressBook deleteGroup:@"L"];
    [addressBook showAll];[addressBook showAll];
==================================================================
奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥奮鬥

人活在世,不僅僅為了自己,更多的是不要讓那些關心你的人失望!!!!

=======================================================

強烈推薦大家,掃描下面二維碼,關注公眾號,滿滿的都是乾貨~~~