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"]);

三、数组、字典、集合的快速遍历

for (<#type *object#> in <#collection#>) {

}
  1. object是遍历得到的元素对象。
  2. 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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 22:21:51

Objective-C学习笔记_字典、集合、数组排序的相关文章

黑马程序员_IOS开发_Objective-C学习笔记_字典

字典 1.字典(dictionary)是由键-对象对组成的数据集合.在与字典中超找单词定义一样,可以通过对象的键从Objective-C字典中获取需要的值(即那个对象).字典中的键必须是单值的,通常他们是字符串,但也可以是其他对象类型.和键关联的值可以是任意对象类型,但不能是nil. 2.练习代码 //1.dictionary 创建一个空字典 NSDictionary *dictionary = [NSDictionary dictionary]; //2.创建并初始化 // dictionar

Python学习笔记_字典(Dict)_遍历_不同方法_性能测试对比

今天专门把python的字典各种方法对比测试了一下性能效果. 测试代码如下: 1 def dict_traverse(): 2 from time import clock 3 my_dict = {'name': 'Jim', 'age': '20', 'height': '180cm', 'weight': '60kg'} 4 5 t_start = clock() 6 for key in my_dict: # 性能最差写法.无优化 7 print 'Type01.01: %s --- %

Swift学习笔记(5)--字典

1.定义 //1.基本定义 [key 1: value 1, key 2: value 2, key 3: value 3] var dict = ["name":"Xiaoqin","sex":"female","age":"20"] for (key,value) in dict { println(key,value) } //2.类型强制定义 Dictionary<keyT

swift学习笔记之二——集合

//=========================== //2014/7/21 17:27 swift集合 //=========================== swift提供了两种集合类型,arrays和dictionaryies,两种集合都是可变的,可以在集合声明后对其进行新增.删除和修改操作. 1.array 数组的定义与java数组相同,但swift的数组提供了更灵活的创建方式和操作方式. 数组创建和初始化方式: var array1: Array<T> = [val1,va

多线程编程学习笔记——使用并发集合(三)

接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费任务的工作者间如何扩展工作量. 1.程序代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sy

十五、Android学习笔记_授权过程

1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理回调接口. 3.在第二步调用回调接口时,它会返回用户的基本信息,比如用户id.此时需要将用户id信息保存起来,为后面登录做准备.回调接口的写法就为myapp://AuthorizeActivity,其中scheme全部为小写字母. <activity android:name="com.wei

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

python 学习笔记 三 字典

字典 Python的高效的key/value哈希表结构叫做"dict", dict的内容可以写成一系列的key:value对并放入{ }中, 相当于: dict = {key1:value1, key2:value2, ...}, 一个空的字典就是俩个大括号{ }. 下面是从一个空字典创建字典以及一些关键点: 数字, 字符串和元组可以作为字典的key, value可以是任何类型(包括字典). ## Can build up a dict by starting with the the

学习笔记 07 --- JUC集合

学习笔记 07 --- JUC集合 在讲JUC集合之前我们先总结一下Java的集合框架,主要包含Collection集合和Map类.Collection集合又能够划分为LIst和Set. 1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack. (01) LinkedList是双向链表实现的双端队列:它不是线程安全的.仅仅适用于单线程. (02) ArrayList是数组实现的队列,它是一个动态数组.它也不是线程安全的,仅仅适用于单线程. (03