欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Objective-C学习笔记_字典、集合、数组排序

程序员文章站 2023-01-28 09:11:24
一字典类 二集合类 三数组字典集合的快速遍历 四数组排序 五数组元素按照数值大小排序 一、字典类 字典?于保存具有映射关系(key-value对)数据的集合。对于“姓名:张三&rdquo...

一字典类 二集合类 三数组字典集合的快速遍历 四数组排序 五数组元素按照数值大小排序

一、字典类

字典?于保存具有映射关系(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