Foundation框架—集合
来源:互联网 发布:如何做网络志愿者 编辑:程序博客网 时间:2024/04/29 16:09
一、数组是实例的有序集合,在Foundation框架中定义为NSArray类。
1. NSArray的基本介绍
NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组。
C语言数组有一个缺点即数组中只能存放同种数据类型的元素。
OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。(也就是集合中不能存放基本数据类型,要是一定要使用的话,只有将基本数据类型包装成对象在放入集合中使用)--- 更多资料在 Foundation框架—NSNumber博文中
2. NSArray的创建
void arrayCreat() { // 普通数组的创建 int a = 5; int ages[10] = {1, 2, 3, 4, 5}; // 创建一个Student对象的数组 Student *stu = [[Student alloc] init]; Student *s[5] = {stu, [[Student alloc] init]}; // 创建一个空数组(静态方法创建);不可变数组 NSArray *array = [NSArray array]; NSArray *array2 = [NSArray array]; // 创建一个元素的数组, 这个数组只用一个元素,且永远只用一个 array = [NSArray arrayWithObject:@"123"]; // 创建多个元素的数组, nil是数组结束的标记,在数组中不能使用nil就是这个原因 array2 = [NSArray arrayWithObjects:@"a", @"b", nil]; }1). NSArray的访问
// 数组的访问 NSUInteger count = [array count]; NSLog(@"长度是%zi", count); // 是否包含某个元素 if ([array containsObject:@"123"]) { NSLog(@"包含了字符串a"); } else { NSLog(@"没有包含了字符串a"); }3. NSArray的遍历
#pragma mark 遍历数组void arrayFor() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; // 快速遍历 int i = 0; for (id obj in array) { // 类似于java中的for(int x :arr) NSLog(@"快速遍历 %i-%@", i, obj); i++; }}// 遍历方式2void arrayFor1() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; NSUInteger count = array.count; for (int i = 0; i < count; i++) { id obj = [array objectAtIndex:i]; NSLog(@"获取遍历 %zi-%@", i, obj); }}// 遍历方式三void arrayFor2() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; // void (^myBlock)(id, NSUInteger, BOOL) = ^(id obj, NSUInteger idx, BOOL *stop) ; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"块遍历 %zi-%@", idx, obj); // 设置停止遍历的位置 if (idx == 1) { // 利用指针修改外边BOOL变量的值,外面的bool变量是看不见的,只有外面的bool变量才能停止遍历 *stop = YES; // } }];}// 遍历方式四void arrayFor3() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; // 获取数组迭代器 NSEnumerator *enumerator = [array objectEnumerator]; // 获取下一个需要遍历的元素 id obj = nil; while (obj = [enumerator nextObject]) { NSLog(@"迭代器遍历 obj = %@", obj); } //反序迭代器(就是从尾部开始遍历) enumerator = [array reverseObjectEnumerator]; // 获取下一个需要遍历的元素 obj = nil; while (obj = [enumerator nextObject]) { NSLog(@"反序迭代器遍历 obj = %@", obj); } }4. 派生出新的数组
void arrayNew() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; NSArray *array1 = [array arrayByAddingObject:@"4"]; NSArray *array2 = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4", @"5", nil]]; NSLog(@"array: %@", array); NSLog(@"array1: %@", array1); NSLog(@"array2: %@", array2); // 从指定位置截取派生新的数组 NSArray *array3 = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; NSRange range = NSMakeRange(1, 2); NSArray *array4 = [array3 subarrayWithRange:range]; NSLog(@"array4: %@", array4); }5. 数组的其他用法 截取分割
void arrarOther() { NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; // 利用分隔符拼接所有元素,将字符串数组组合成字符串 NSString *str = [array componentsJoinedByString:@"-"]; // 将字符串变成字符创数组 NSArray *array1 = [str componentsSeparatedByString:@","]; NSLog(@"%@", str); NSLog(@"%@", array1);}6. 数组的排序
// 数组排序void arraySort() { NSArray *array = [NSArray arrayWithObjects:@"11", @"2", @"32", @"4", nil]; // 返回一个排好序的数组,原来数组的元素顺序不会改变 NSArray *array1 = [array sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@", array1); }// 数组排序2 复杂void arraySort1() { Student *stu1 = [Student studentWithFirstName:@"zhong" andLastName:@"ye"]; Student *stu2 = [Student studentWithFirstName:@"zhang" andLastName:@"xi"]; Student *stu3 = [Student studentWithFirstName:@"chen" andLastName:@"hai"]; Student *stu4 = [Student studentWithFirstName:@"liu" andLastName:@"dong"]; // 当数组被销毁是,里面的所有元素会做一次 release操作 NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, stu4, nil]; NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)]; NSLog(@"array2 %@", array2); }
二、NSMutableArray 可变数组
1. NSMutableArray的基本使用
注意:NSMutableArray继承自NSArray,几乎拥有NSArray的一切方法。
void kebian() { // 创建一个可变数组 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"nihao", @"haoa", nil]; // 添加元素 // 添加一个student对象 [array addObject:[[Student alloc] init]]; // 添加一个字符串对象 [array addObject:@"nihaome"]; // 注意oc中的字符串不能是空nil // 下面是错误的 [array addObject:nil]; // 删除元素 // 删除所有元素 [array removeAllObjects]; // 删除指定元素 [array removeObject:@"nihao"]; // 删除指定元素的对象 [array removeObjectAtIndex:0]; NSLog(@"%@", array); NSLog(@"%ld", array.count); }三、NSSet和NSMutableSet 不可变集合与可变集合
无序集合(简称集合)与数组不同,他是没有先后顺序的。集合的优势在于,它保证每个集合成员唯一性,因此当判断某个实例是否位于集合中时,或是判断某个集合是否是另一个集合的子集时,集合的效率要远高于数组。
集合在很多方面与数组很类似。集合也分为不可修改的NSSet类与可修改的NSSet类。
1. 不可变集合NSSet 基本使用
void jihe() { // 创建一个NSSet NSSet *S = [NSSet set]; NSLog(@"%@", S); // 因为不可变,所以set永远为空 // 创建一个有多个元素的NSSet NSSet *s = [NSSet setWithObjects:@"nihao", @"shia", nil]; NSSet *s1 = [NSSet setWithObjects:@"nihao", @"shia", nil]; NSSet *s2 = [NSSet setWithObjects:@"nihao", @"shia", @"nihaoa", nil]; // 比较两个集合是否存在交集 BOOL result = [s intersectsSet:s1]; NSLog(@"s intersectsSet:s1 : %@", [s intersectsSet:s1]? @"YES":@"NO"); // 方法与下面效果类似 NSLog(@"s intersectsSet:s1: %i", result); // 比较两个几个是否存在包含关系 后者是否包含前者 BOOL result1 = [s2 isSubsetOfSet:s1]; NSLog(@"s intersectsSet:s2: %i", result1); // 比较两集合是否完全相等 BOOL result2 = [s isEqualToSet:s1]; NSLog(@"s intersectsSet:s2: %i", result2); // 比较两个集合是否完全相等 // 随机取出一个 NSString *str = [s anyObject]; NSLog(@"%@", str); }2. 可变集合NSMutableSet
void jihe2() { // 创建一个NSMutableSet NSMutableSet *s = [NSMutableSet set]; // 添加元素 [s addObject:@"nihaome"]; // 删除元素 // 删除指定元素 [s removeObject:@"nihaome"];}3. 可变与不可变的对比
1)共同点:
1)都是集合,都能够存放多个对象
2)只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)。
3)本身都不可变,都有一个可变的子类。
2)不同点:
1)NSArray有顺序,NSSet没有顺序
四、NSDictionary 与 NSMutableDictionary
1.不可变字典
1). 介绍现实中的字典:根据索引找到具体的内容
OC中的NSDictionary:根据key找到value。里面存储的东西都是键值对。
2). 字典的创建
void dictCreat() { // NSDictionary 是不可变的 NSDictionary *dict = [NSDictionary dictionaryWithObject:@"you" forKey:@"i love"]; NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys: @"you", @"i love", @"you", @"love", nil]; // 切记键值对不能是一样的,不然只会输出其中一个 NSLog(@"dict %@", dict); NSLog(@"dict1 %@", dict1); NSArray *objects = [NSArray arrayWithObjects:@"a1", @"a2", @"a3", nil]; NSArray *keys = [NSArray arrayWithObjects:@"b1", @"b2", @"b3", nil]; dict1 = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; NSLog(@"dict2 %@", dict1); }3). 字典的访问
void dictOther() { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a1", @"k1", @"a2", @"k2", @"a3", @"k3", nil]; // 计算键值对对数 NSLog(@"count = %zi", dict.count); // 由于NSDictionary是不可变的,所以只能取值,而不能修改值 id obj = [dict objectForKey:@"a2"]; NSLog(@"obj = %@", obj); // 将字典写入文件中 // atomicall 原子行 就是当文件写入成功后在进行创建 NSString *path = @"/Users/shumei/Desktop/test.xml"; [dict writeToFile:path atomically:YES]; // 从文件中读取内容 dict = [NSDictionary dictionaryWithContentsOfFile:path]; NSLog(@"dict = %@", dict); }
void dictUse() { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a1", @"k1", @"a2", @"k2", @"a3", @"k3", nil]; // 返回所有的key NSArray *keys = [dict allKeys]; NSLog(@"keys = %@", keys); NSArray *objects = [dict allValues]; NSLog(@"objects = %@", objects); // 跟库多个key取出对应的多个value // 当key找不到对应的value时候,用mark参数代替 objects = [dict objectsForKeys:[NSArray arrayWithObjects:@"k1", @"k2", @"k3", nil] notFoundMarker:@"not-fount"]; NSLog(@"objects = %@", objects);}4). 字典的遍历
// 遍历字典 迭代器void dictFor1() { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a1", @"k1", @"a2", @"k2", @"a3", @"k3", nil]; // 遍历字典的所有key NSEnumerator *enumer = [dict keyEnumerator]; id key = nil; while (key = [enumer nextObject]) { id value = [dict objectForKey:key]; NSLog(@"%@ = %@", key, value); } }// 遍历字典 代码块void dictFor2() { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"a1", @"k1", @"a2", @"k2", @"a3", @"k3", nil]; [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@ = %@", key, obj); }]; }2. 可变字典
注意:这种快速创建的方式只适用于不可变字典。
- Foundation框架—集合
- Foundation框架—集合
- Foundation框架—集合
- Foundation框架—集合
- Foundation框架——集合初级
- IOS学习之Foundation框架—集合
- Foundation框架---“集合类”
- Foundation框架-集合
- Foundation框架 - 集合
- OC基础——Foundation框架之集合型类
- 黑马程序员——Foundation框架:字符串之集合类
- 黑马程序员——Foundation框架字典、集合类、反射
- OutMan——Foundation框架中的集合类(三)
- 黑马程序员—09Foundation框架_集合01
- 黑马程序员—10Foundation框架_集合02
- Foundation——集合
- Objective-C Foundation框架 字符串、集合
- Cocoa Foundation 框架:NSSet集合的使用
- 管理中的外行与内行
- hdu 1068 最大独立子集问题
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
- FPGA基本知识小结
- [POJ 1325] Is It A Tree? 并查集
- Foundation框架—集合
- React对比Angular的优势在哪
- windows 权限
- 【Deep Learning】1.深度学习:稀疏自编码器
- 数字计算次数问题实例
- PHP遍历文件夹内容
- C/C++中extern关键字详解
- 黑色笼罩中国联通:半年流失近千万用户 4G发展停滞不前---OFweek
- VC++动态链接库(DLL)编程深入浅出(zz)