Objective-C学习笔记_字典、集合、数组排序
一字典类 二集合类 三数组字典集合的快速遍历 四数组排序 五数组元素按照数值大小排序
一、字典类
字典?于保存具有映射关系(key-value对)数据的集合。对于“姓名:张三”来讲,key就是“姓名”,key对应的value是“张三”。一个key-value对认为是?个条目,字典是存储key-value对的容器。与数组不同,字典靠key存取元素。key不能重复,value必须是对象。键值对在字典中是无序存储的。字典也分为,不可变字典(nsdictionary)和可变字典(nsmutabledictionary)。
nsdictionary,不可变字典,继承nsobject。即字典一旦创建,键值对就不可更改,不可添加,不可删除。仅能读取key或者value。
/* 不可变字典 */ /* 创建对象 */ nsdictionary *dic = [nsdictionary dictionarywithobjectsandkeys: @zhangsan, @name, @man, @sex, @18, @age, @130, @weight, nil]; /* 输出字典 */ nslog(@%@, dic); /* 获取所有的key值 */ [dic allkeys]; nslog(@%@, [dic allkeys]); /* 获取所有的value值 */ [dic allvalues]; nslog(@%@, [dic allvalues]); /* 通过key查询value值 */ [dic objectforkey:@name]; nslog(@%@, [dic objectforkey:@name]); [dic valueforkey:@name]; nslog(@%@, [dic valueforkey:@name]); /* 遍历字典 */ nsarray *keyarr = [dic allkeys]; for (int i = 0; i < keyarr.count; i++) { nsstring *keystr = [keyarr objectatindex:i]; nslog(@%@, [dic objectforkey:keystr]); } /* 快速遍历 */ for (nsstring *key in dic) { nslog(@%@, [dic objectforkey:key]); } /* keyarr快速遍历 */ for (nsstring *str in keyarr) { nslog(@%@, str); }
nsmutabledictionary,可变字典,继承nsdictionary。可以对管理的键值对进?行增、删、改。
/* 可变字典 */ nsmutabledictionary *mdic = [nsmutabledictionary dictionarywithobjectsandkeys: @lisi, @name, @18, @age, @woman, @sex, @120, @weight, nil]; for (nsstring *key in mdic) { nslog(@%@, [mdic objectforkey:key]); } /* 增加键值对 */ [mdic setobject:@170cm forkey:@height]; [mdic setvalue:@volleyball forkey:@hobby]; for (nsstring *key in mdic) { nslog(@%@, [mdic objectforkey:key]); } /* 修改键值对 */ [mdic setobject:@20 forkey:@age]; for (nsstring *key in mdic) { nslog(@%@, [mdic objectforkey:key]); } /* 删除键值对 */ [mdic removeobjectforkey:@hobby]; for (nsstring *key in mdic) { nslog(@%@, [mdic objectforkey:key]); }
二、集合类
集合类*nsset,类似数学中集合的概念,具有确定性、无序性、互异性*。即集合中存储的元素必须是对象类型,存储的元素是无顺序的,存储的元素唯一。集合类也分为nsset和nsmutableset。
nsset的示例代码如下:
/* 不可变set */ /* 创建 */ nsset *set = [nsset setwithobjects:@四平, @长春, @吉林, @四平, nil]; /* 获取set元素个数 */ nslog(@%lu, set.count); /* 获取set中某一元素 */ nslog(@%@, [set anyobject]); /* 判断set中是否包含某一个对象 */ if ([set containsobject:@沈阳]) { nslog(@有); } else { nslog(@无); } /* 遍历集合 */ for (nsstring *str in set) { nslog(@%@, str); }
nsmutableset的示例代码如下:
/* 可变集合 */ nsset *set2 = [nsset setwithobjects:@dalian, @beijing, nil]; nsmutableset *mset = [nsmutableset setwithset:set2]; /* 合并两个集合 */ [mset unionset:set]; for (nsstring *str in mset) { nslog(@%@, str); } /* 相交两个集合 */ [mset intersectset:set]; /* 添加元素 */ [mset addobject:@通化]; /* 删除元素 */ [mset removeobject:@beijing]; for (nsstring *str in mset) { nslog(@*%@*, str); }
nscountedset是nsmutableset的子类,能记录元素的重复次数。在nsset的基础上添加了计数功能。
nscountedset的示例代码如下:
/* nscountedset类 */ nsarray *arr = [nsarray arraywithobjects:@zhang, @lisi, @lisi, @wang, @wang, @lisi, nil]; nscountedset *countset = [nscountedset setwitharray:arr]; /* 查看countset元素个数 */ nslog(@%lu, countset.count); /* lisi计数 */ nslog(@%lu, [countset countforobject:@lisi]);
三、数组、字典、集合的快速遍历
delphi="">for (<#type *object#> in <#collection#>) { }object是遍历得到的元素对象。 collection是集合类型的对象:数组、字典、集合。
集合类型枚举的特点
数组枚举得到数组中的元素对象。 字典枚举得到字典中的key值。 集合枚举得到集合中的元素对象。nsdictionary *dic = [nsdictionary dictionarywithobjectsandkeys: @zhangsan, @name, @man, @sex, @18, @age, @130, @weight, nil]; /* 快速遍历 */ for (nsstring *key in dic) { nslog(@%@, [dic objectforkey:key]); }
四、数组排序
数组排序取决于判断条件,判断条件决定了排序的?式(升序、降序)。ios为数组提供了排序?法,同时提供了接口让我们传递判断条件。
nsmutablearray *marr = [nsmutablearray arraywithobjects:@3, @2, @1, @4, nil]; /* 可变数组排序 */ /* @selector --> 方法选择器, 获取方法名的意思. * compare: --> 数组中元素的方法(元素是字符串, compare是字符串的一个方法) */ [marr sortusingselector:@selector(compare:)]; nslog(@%@, marr); /* 不可变数组排序 */ nsarray *arr = [nsarray arraywithobjects:@4, @2, @1, @3, nil]; nsarray *sortarr = [arr sortedarrayusingselector:@selector(compare:)]; nslog(@%@, sortarr);
五、数组元素按照数值大小排序
数组中存储的元素是对象类型,如果存储的元素都是数值对象,按照上述方法排序就不能得到正确的结果。因此,需要使用nsnumberformatter将字符串转化为nsnumber对象。具体实现代码如下:
#pragma mark - 数值数组排序 #if 1 nsarray *arr = @[@1, @12, @122, @67, @50, @666]; nsmutablearray *numarr = [nsmutablearray array]; for (nsstring *string in arr) { // nsnumberformatter格式转化 nsnumberformatter *format = [[nsnumberformatter alloc] init]; // nsstring 转成 nsnumber nsnumber *num = [format numberfromstring:string]; [numarr addobject:num]; } // 根据数组里元素的类型来调用相应的方法, 相当于排序中条件判断 nslog(@%@, [numarr sortedarrayusingselector:@selector(compare:)]); #endif
上一篇: 我比博尔特厉害
下一篇: 朋友当初把自己年龄改大了几岁
推荐阅读
-
C#学习笔记- 浅谈数组复制,排序,取段,元组
-
Objective-C学习笔记_字典、集合、数组排序
-
ObjectC----字典类和集合类以及快速枚举和OC中的数组排序
-
5.4 集合的排序(Java学习笔记)(Collections.sort(),及Arrays.sort()底层分析)
-
学习笔记(按奇偶排序数组 II)
-
Java从入门到精通_学习笔记07(数组的排序算法)
-
swift学习笔记——集合类型(数组)
-
Python学习笔记(二)【基本数据类型:number类型、字符串类型、bool类型、list列表、tuple元组、dict字典、set集合】
-
算法图解第二章--选择排序法(数组,链表的进一步理解)(学习笔记)
-
Objective-C学习笔记_字典、集合、数组排序