一道例题的详解

实现中等难度通讯录。需求:

1、定义联系人类AddressContact。实例变量:姓名(拼音,?字母大写)、性别、电话号码、住址、分组名称、年龄。?法:?定义初始化方法(姓名、电话号码)、显?联系人信息

2、在main.m中定义字典,分组管理所有联系人。分组名为26个?写的英文字母。
3、可以添加联系人对象,如果姓名或电话号码为空,添加失败。添加联系人到匹配的分组。

4、获取某个分组名称下所有联系人,并且按照姓名升序排列。
5、从通讯录中根据电话号码搜索联系人。
6、获取所有女性的联系人,并且按照年龄的降序排列。

7、根据姓名删除某个联系人。

8、删除某个分组的全部联系人。

Contact.h中代码

 1 #import <Foundation/Foundation.h>
 2
 3 //这是一个联系人类,用于存储单个联系人的信息
 4 //并且能够提供联系人相关内容
 5 //这个类是一个Model类
 6
 7 @interface Contact : NSObject
 8 {
 9     NSString *_name;    //姓名
10     NSString *_sex;     //性别
11     NSString *_phone;   //电话
12     NSString *_address; //地址
13     NSString *_groupName;   //组名
14     NSInteger _age;     //年龄
15 }
16 //初始化方法,初始化的时候需要给定一个姓名和电话
17 - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone;
18
19 - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone sex:(NSString *)sex age:(NSInteger)age;
20
21 //显示联系人信息
22 - (void)displayInfo;
23
24 //获取联系人姓名
25 - (NSString *)name;
26
27 //获取联系人电话
28 - (NSString *)phone;
29
30 //获取联系人分组信息
31 - (NSString *)groupName;
32
33 //获取联系人性别
34 - (NSString *)sex;
35
36 - (NSInteger)age;
37
38 //联系人按姓名比较
39 - (NSComparisonResult)compareByName:(Contact *)contact;
40
41 //联系人按年龄比较
42 - (NSComparisonResult)compareByAge:(Contact *)contact;
43
44 @end

Contact.m中代码

 1 #import "Contact.h"
 2
 3 @implementation Contact
 4
 5 - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone
 6 {
 7     return [self initWithName:name phone:phone sex:nil age:0];
 8 }
 9 //指定初始化方法
10 - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone sex:(NSString *)sex age:(NSInteger)age
11 {
12     self = [super init];
13     if (self) {
14         _name = name;
15         _sex = sex;
16         _groupName = [_name substringToIndex:1];
17         _age = age;
18         _phone = phone;
19     }
20     return self;
21 }
22
23 - (void)displayInfo
24 {
25     NSLog(@"name:%@ sex:%@ phone:%@ address:%@ group:%@ age:%ld",_name,_sex,_phone,_address,_groupName,_age);
26 }
27
28
29 - (NSString *)name
30 {
31     return _name;
32 }
33
34 - (NSString *)sex
35 {
36     return _sex;
37 }
38
39 - (NSString *)phone
40 {
41     return _phone;
42 }
43
44
45 - (NSString *)groupName
46 {
47     return _groupName;
48 }
49
50 - (NSComparisonResult)compareByName:(Contact *)contact
51 {
52     NSString *myName = [self name];
53     NSString *otherName = [contact name];
54     NSComparisonResult result = [myName compare:otherName];
55     if (result == NSOrderedAscending) {
56         return NSOrderedDescending;
57     }else if (result == NSOrderedDescending){
58         return NSOrderedAscending;
59     }else {
60         return NSOrderedSame;
61     }
62 //    return result;
63 }
64
65 - (NSInteger)age
66 {
67     return _age;
68 }
69
70 - (NSComparisonResult)compareByAge:(Contact *)contact
71 {
72     NSInteger myAge = [self age];
73     NSInteger otherAge  = [contact age];
74     if (myAge > otherAge) {
75         return NSOrderedAscending;
76     }else if (myAge < otherAge){
77         return NSOrderedDescending;
78     }else {
79         return NSOrderedSame;
80     }
81 }
82
83 @end

ContactManager.h中代码

 1 #import <Foundation/Foundation.h>
 2 #import "Contact.h"
 3
 4 //这个类是一个联系人管理类,主要用于添加,删除,获取,搜索联系人等
 5
 6 @interface ContactsManager : NSObject
 7 {
 8     //用于存储所有联系人的字典
 9     NSMutableDictionary *_contactsDic;
10 }
11 - (instancetype)init;
12
13 //添加联系人
14 - (void)addContact:(Contact *)contact;
15
16 //根据groupName获取一组联系人
17 - (NSArray *)contactsForGroupName:(NSString *)groupName;
18
19 //根据电话号码,获取联系人
20 - (Contact *)contactForPhone:(NSString *)phone;
21
22 //根据性别,获取联系人
23 - (NSArray *)contactsForSex:(NSString *)sex;
24
25 //删除指定姓名的联系人
26 - (void)removeContactForName:(NSString *)name;
27
28 //删除指定分组的所有联系人
29 - (void)removeContactsForGroup:(NSString *)groupName;
30
31 //显示所有人的信息
32 - (void)displayAllContacts;
33
34 @end

ContactsManager.m中代码

  1 #import "ContactsManager.h"
  2
  3 @implementation ContactsManager
  4
  5 -(instancetype)init{
  6     self = [super init];
  7     if (self) {
  8         _contactsDic = [[NSMutableDictionary alloc] initWithCapacity:26];
  9     }
 10     return self;
 11 }
 12
 13 - (void)addContact:(Contact *)contact
 14 {
 15     NSString *name = [contact name];
 16     NSString *phone = [contact phone];
 17     if ([name isEqualToString:@""] || name == nil || [phone isEqualToString:@""] || phone == nil) {
 18         return;
 19     }
 20
 21     NSString *groupName = [contact groupName];
 22     NSMutableArray *group = [_contactsDic objectForKey:groupName];
 23     if (group == nil) {
 24         NSLog(@"分组不存在");
 25         //创建一个数组,把人放数组里,把数组放字典里
 26         group = [[NSMutableArray alloc] initWithCapacity:10];
 27         [group addObject:contact];
 28         [_contactsDic setObject:group forKey:groupName];
 29     }else {
 30         [group addObject:contact];
 31     }
 32 }
 33
 34 - (NSArray *)contactsForGroupName:(NSString *)groupName
 35 {
 36     NSMutableArray *group = [_contactsDic objectForKey:groupName];
 37     [group sortUsingSelector:@selector(compareByName:)];
 38     return group;
 39 }
 40
 41 - (NSArray *)contactsForSex:(NSString *)sex
 42 {
 43     NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:10];
 44
 45     for (NSString *key in _contactsDic) {
 46         NSMutableArray *group = [_contactsDic objectForKey:key];
 47         for (Contact *c in group) {
 48             NSString *s = [c sex];
 49             if ([s isEqualToString:sex]) {
 50                 [results addObject:c];
 51             }
 52         }
 53     }
 54
 55     [results sortUsingSelector:@selector(compareByAge:)];
 56
 57     return results;
 58 }
 59
 60 - (Contact *)contactForPhone:(NSString *)phone
 61 {
 62     for (NSString *key in _contactsDic) {
 63         NSMutableArray *group = [_contactsDic objectForKey:key];
 64         for (Contact *c in group) {
 65             NSString *p = [c phone];
 66             if ([p isEqualToString:phone]) {
 67                 return c;
 68             }
 69         }
 70     }
 71     return nil;
 72 }
 73
 74 - (void)removeContactForName:(NSString *)name
 75 {
 76     NSMutableArray *arr = nil;
 77     Contact *toDelete = nil;
 78     for (NSString *key in _contactsDic) {
 79         NSMutableArray *group = [_contactsDic objectForKey:key];
 80         for (Contact *c in group) {
 81             NSString *n = [c name];
 82             if ([n isEqualToString:name]) {
 83                 arr = group;
 84                 toDelete = c;
 85             }
 86         }
 87     }
 88     [arr removeObject:toDelete];
 89 }
 90 - (void)removeContactsForGroup:(NSString *)groupName
 91 {
 92     [_contactsDic removeObjectForKey:groupName];
 93 }
 94
 95 - (void)displayAllContacts
 96 {
 97     NSArray *allKeys = [_contactsDic allKeys];
 98     NSArray *sortedKeys = [allKeys sortedArrayUsingSelector:@selector(compare:)];
 99     for (NSString *key in sortedKeys) {
100         NSMutableArray *group = [_contactsDic objectForKey:key];
101         NSLog(@"---%@---",key);
102         for (Contact *c in group) {
103             [c displayInfo];
104         }
105     }
106
107
108 //    for (NSString *key in _contactsDic) {
109 //        NSMutableArray *group = [_contactsDic objectForKey:key];
110 //        NSLog(@"---%@---",key);
111 //        for (Contact *c in group) {
112 //            [c displayInfo];
113 //        }
114 //    }
115 }
116
117 @end

main.m中代码

 1 #import <Foundation/Foundation.h>
 2 #import "ContactsManager.h"
 3
 4 int main(int argc, const char * argv[])
 5 {
 6 //    NSString *allColorString = [NSString stringWithContentsOfFile:@"/Users/apple/Desktop/crayons.txt" encoding:NSUTF8StringEncoding error:nil];
 7 //    NSArray *colors = [allColorString componentsSeparatedByString:@"\n"];
 8 //    NSLog(@"%@",[[colors objectAtIndex:0] componentsSeparatedByString:@" #"]);
 9
10
11     //联系人管理器
12     ContactsManager *cm = [[ContactsManager alloc] init];
13     //联系人1
14     Contact *mohang = [[Contact alloc] initWithName:@"Mohan" phone:@"13925082699" sex:@"男" age:22];
15     //联系人2
16     Contact *mochou = [[Contact alloc] initWithName:@"Mochou" phone:@"13854389438" sex:@"女" age:20];
17     //联系人3
18     Contact *moyan = [[Contact alloc] initWithName:@"Moyan" phone:@"18100000000" sex:@"男" age:46];
19
20     //联系人4
21     Contact *yangbailao = [[Contact alloc] initWithName:@"Yangbailao" phone:@"13944774747" sex:@"男" age:56];
22     //联系人5
23     Contact *yangxier = [[Contact alloc] initWithName:@"Yangxier" phone:@"13837373737" sex:@"女" age:18];
24     //联系人6
25     Contact *panjinlian = [[Contact alloc] initWithName:@"Panjinlian" phone:@"18188888888" sex:@"女" age:27];
26
27     //联系人1
28     Contact *caocao = [[Contact alloc] initWithName:@"Caocao" phone:@"1811111111" sex:@"男" age:47];
29     //联系人2
30     Contact *caozhi = [[Contact alloc] initWithName:@"Caozhi" phone:@"13274747474" sex:@"男" age:16];
31     //联系人3
32     Contact *caopi = [[Contact alloc] initWithName:@"Caopi" phone:@"18699995555" sex:@"男" age:34];
33
34     [cm addContact:mohang];
35     [cm addContact:mochou];
36     [cm addContact:moyan];
37     [cm addContact:panjinlian];
38     [cm addContact:yangbailao];
39     [cm addContact:yangxier];
40     [cm addContact:caocao];
41     [cm addContact:caopi];
42     [cm addContact:caozhi];
43
44 //    [cm displayAllContacts];
45
46 //    [cm removeContactForName:@"Mohang"];
47 //    [cm removeContactForName:@"Moyan"];
48 //
49 ////    [[cm contactForPhone:@"18188888888"] displayInfo];
50 ////    NSLog(@"---");
51 ////    NSArray *mContacts = [cm contactsForSex:@"女"];
52 //    NSArray *mContacts = [cm contactsForGroupName:@"M"];
53 //
54 ////    NSLog(@"%@",mContacts);
55 //    for (Contact *c in mContacts) {
56 //        [c displayInfo];
57 //    }
58 ////    [cm removeContactForName:@"Haojianming"];
59
60     return 0;
61 }

一道例题的详解

时间: 2024-10-29 02:47:56

一道例题的详解的相关文章

C语言之内存分配例题详解

1.C中内存分为四个区 栈:用来存放函数的形参和函数内的局部变量.由编译器分配空间,在函数执行完后由编译器自动释放.  堆:用来存放由动态分配函数(如malloc)分配的空间.是由程序员自己手动分配的,并且必须由程序员使用free释放.如果忘记用free释放,会导致所分配的空间一 直占着不放,导致内存泄露.  全局:用来存放全局变量和静态变量.存在于程序的整个运行期间,是由编译器分配和释放的.  例1. 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值.     int n;

BIT 树状数组 详解 及 例题

(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了.所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多.下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4

线段树详解 (原理,实现与应用)

线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点. 线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n)). 线段树的原理,就是,将[1,n]分解成若干特定的子区间(数量不超过4*n),然后,将每个区间[L,R]都分解为 少量特定的子区

网络流初步详解

众所周知,网络流是探究网络上运输的一种图论分支.但是大多数人在第一次接触这个题时都有些畏惧感(比如说我),大佬可以自信跳过.. 本文包括: 1.网络流的概念及基本性质 2.略谈 Edmonds-Karp增广路算法 3.详谈 Dinic 算法 4.网络流的应用以及ISAP算法引入 1 . 网络流的概念及基本性质 网络流是图论的一种重要分支,我们可以将网络流初步理解为一种 水道 一样的网络. 基本定义: (部分参考<算法竞赛进阶指南>) 对于一个网络 \(G = (V , E )\) 为一张有向图

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

grep详解

grep详解 简介:grep:(global search regular expression(RE))and  print out the line 文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行. 正则表达式:是一类字符所书写出来的模式(PATTERN) 模式分为:基本正则表达式和扩展正则表达式 元字符:不表示字符本身的意义,用于额外功能性的描述 基本正则表达式的元字符:元字符使用引号 grep格式:grep  [option] 'PATTERN'

算法笔记--sg函数详解及其模板

sg函数大神详解:http://blog.csdn.net/luomingjun12315/article/details/45555495 模板: int f[N],SG[N]; bool S[M]; void getSG(int n) { memset(SG,0,sizeof(SG)); for(int i=1;i<=n;i++) { memset(S,false,sizeof(S)); for(int j=1;f[j]<=i&&j<M;j++) { S[SG[i-f

三剑客之老二sed详解

    三剑客之老二sed 第1章 sed介绍 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件等等.如果我们相对这些文件进行一些编辑查询等操作时,我们可能会想到一些vi,vim,cat,more等命令.但是这些命令效率不高,这就好比一块空地准备搭建房子,请了10个师傅拿着铁锹挖地基,花了一个月的时间才挖完,而另外一块空地则请了个挖土机,三下五除二就搞定了,这就是效率.而在linux中的"挖土机"有三种型号:顶配awk,中配sed,标配grep.使用这些工具,我们

三剑客之 sed详解

    sed 作者:Jack.X 归档:学习笔记 2017/4/13 三剑客之sed 第1章 sed详解: 1.1 sed介绍: sed是linux命令中三剑客的老二,sed命令是操作.过滤和转换文本内容的强大工具,常用功能有增删改查(增加,删除,修改,查询).其中查询的功能中最常用的两大功能是过滤(过滤指定字符串),取行(取出指定行). 我先在用的sed版本是GNU开源版本的,实验环境是Centos6.8系统,内核是2.6.32-642.el6.x86_64 [[email protecte