iOS——之数组 字典 枚举

来源:互联网 发布:淘宝产品推广公司 编辑:程序博客网 时间:2024/05/18 00:46

// OC中常用的集合(容器)有: 1.NSArray 数组,2. NSDictionary 字典 3. NSSet 集合
数组:NSArray 继承自NSObject,不可变的数组,用于管理一系列对象的一个有序的集合,注意:数组中只能存放对象类型

// 创建拥有对象的数组
//nil 是一个数组定义结束的标志,或者说是遇到nil 停止
NSArray *arr2 = [[NSArray alloc ]initWithObjects:@“李梦”,@“2”,@“3”,nil];
NSLog(@“%@“,srr2); //打印的是数组对象,不能把数组中存储的中文正常输出
// 单独打印数组中的元素,如果是中文的话,也可以正常输出
NSLog(@“%@“,arr[0]);

// 使用便利构造器创建数组
NSArray *arr3=[NSArrayarrayWithObjects:@”zuo”,@”xiao”,@”mingren”,@”bai”,nil];

// 用一个已经存在的数组初始化另一个数组
NSArray *arr4 = [[NSArray alloc]initWithArray:arr3];// 以对象调用
NSArray *arr5 = [NSArray arrayWithArray:arr4]; // 以类调用

// 如何访问数组中的元素

// 1. 获取数组元素的个数
NSUInteger count = [arr5 = count];
NSLog(@”count = %lu”,count);
// 2. 根据下标获取数组中对应的元素
NSLog(@”%@”,arr5[1]);
// 访问数组中第一个元素
NSLog(@”%@”,[arr5 firstObject]);
// 访问数组中最后一个元素
NSLog(@”%@”,[arr5 lastObject]);
// 3. 返回给定位置的对象
id object = [arr5 objectAtIndex:2]; // 如果你不知道数组中存放的是什么类型的对象,使用 id 类型的对象去接收
NSLog(@”%@”,object);
// NSString *object3 = object; //从 id 类型转换为所需要的类型
NSString *object2 = [arr5 objectAtIndex:1];
// 如果知道数组中存放的是什么类型,最好就是用哪个类型的对象去接收
NSLog(@”%@”,object2);

         [ a   arrayByAddingObject:@“d”];   可以将不可变数组的返回值添加一个元素,但是原有的不可变数组并没有发生改变

// 4. NSMutableArray 继承自NSArray,管理的是一个能够改变元素的数组
// 创建可变数组对象
NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:0];
// 便利构造器的形式创建可变数组对象
NSMutableArray *Arr1 = [NSMutableArray arrayWithCatacity:0];

// 5. 向数组中添加元素
[mArr1 addObject:@”songXiaoBao”];
[mArr1 addObject:@”xiaoShenYang”];
[mArr1 addObject:@”zhaoSi”];

// 6. 添加多个元素
NSArray *arr6 = [NSArray arrayWithObjects:@”程序猿”,@”shejishi”,@”产品够”,@”运营鼠”,@”客服牛”,@”销售猴”,@”总经理”,nil];
NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:0];
// 以一个数组向可变数组中添加元素
[mArr2 addObjectsFromArray:arr6];

// 7. 向某个位置插入元素
NSMutableArray *mArr3 = [NSMutableArray arrayWithCapacity:0];
[mArr3 addObject:@”44”];
[mArr3 addObject:@”33”];
[mArr3 addObject:@”22”];
[mArr3 addObject:@”11”];
NSLog(@”%@”,mArr3);
[mArr3 insertObject:@”00” atIndex:1];
// 第一个是想要插入的字符串,第二个是插入数组的位置,插入后默认数组元素个数 +1
NSLog(@“%@“,mArr3);

// 8. 交换两个位置的元素
[mArr3 exchangeObjectAtIndex:0 withObjectAtIndex:2];

NSMutableArray *mArr4=[[NSMutableArray alloc]initWithObjects:@”tuChuan”,@”dfa”,@”shiBo”,@”weiWei”,nil];

// 9. 删除指定的对象 @“tuchuan”
[mArr4 removeObject:@”tuChuan”];

// 10 . 删除给定下标的元素
[mArr4 removeObjectAtIndex:0];

// 11. 删除数组最后一个元素
[mArr4 removeLastObject];

// 12 删除数组中所有的元素
[mArr4 removeAllObjects];

// 遍历这个数组
NSUInteger count1 = [mArr5 count]; // 先得到数组元素个数
for (int i = 0; i < count1; i ++) {
NSString *string = mArr5[i];
NSLog(@”%@”,string);
// 方式二(直接打印): NSLog(@”%@”,mArr5[i]);
}

// ——————————————————————————————————————//

// 快速枚举 forin
for (<#type *object#> (//集合中的对象类型)in <#collection#>(//集合类型,也就是数组名)) {
<#statements#> (//循环体)
}

// OC提供的快速枚举遍历集合时,不需要在关心集合中元素的个数,个数由方法内部做处理
// 每一次循环都把找到的元素赋值给我们提供的变量,比如(NSString *string)
// 此时就可以在循环体内找到对象做一些处理(比如:打印)
// 注意:::在快速枚举的过程中,不能对数组做任何处理!!!!!

for (NSString *string in mArr5) {
// [mArr5 removeObject:string]; // error!!
NSLog(@”%@”,string);
}
// 创建四个人的对象
Person *p = [Person personWithName:@”cangLaoShi” sex:@”woman”];
Person *p1 = [Person personWithName:@”jiZeMingBu” sex:@”yao”];
Person *p2 = [Person personWithName:@”tianHaiYi” sex:@”man”];
Person *p3 = [Person personWithName:@”chenGuanXi” sex:@”shen”];

  // 将人的对象添加到数组中并遍历NSMutableArray *pArr = [NSMutableArray arrayWithObjects:p,p1,p2,p3,nil];for (Person *p in pArr) {    NSLog(@"%@",p);

// ——————————————————————————————————————//

// 数组的排序

NSMutableArray *mArr6 = [NSMutableArray arrayWithObjects:@”00”,@”22”,@”11”,@”33”,nil];

/* NSUInteger count2 = [mArr6 count]; // 先计算数组元素的个数
for (int i = 0; i < count2 -1; i++) {
for (int j = 0; j < count2 - i - 1; j++) {
// if ([mArr6[j] compare:mArr6[j+1]] == 1) {
// NSString *temp = mArr6[j];
// mArr6[j] = mArr6[j+1]; // 被注的是C中的冒泡排序
// mArr6[j+1] = temp;
if ([mArr6[j] compare:mArr6[j+1] ]== NSOrderedDescending) {
[mArr6 exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
// }
}
}
// for (int i = 0; i < count2; i++) {
// NSLog(@”%@”,mArr6 [i]);
// }
for (NSMutableArray *mA in mArr6) {
NSLog(@”%@”,mA);
}
*/

// 在OC中数组的排序方式:
// SEL = @selector 它是一个方法选择器,@selector()小括号中只需要提供比较元素大小的方法就可以了;
// sortedArrayUsingSelector: 返回的是一个升序的数组
NSArray *sortArray = [mArr6 sortedArrayUsingSelector:@selector(compare:)];
for (NSString *string in sortArray) {
NSLog(@”%@”,string);
}

// ——————————————————————————————————————//
字典:NSDictionary
// ——————————————————————————————————————//

// 字典 NSDictionary 继承自NSObject,是一个不可变的字典,字典中存放的元素都是以键值(key-value)对的形式出现,并且key是唯一的,不能重复
// 1. 字典中只能存放对象类型的数组,且字典中存储的键值对是无序的
// 2. 存放数据的形式 : key:value , key2:value , … kayN : valueN
// 3. key = 键 value = 值,俗称键值对
// 4. key值是唯一的,但是value是可以重复的
// 5. 打印字典的标志是一对大括号 { }

NSDictionary *dict1 = [[NSDictionary alloc]initWithObjectsAndKeys:@“zhangsan”,@“name”,@“yao”,@“sex”,@“38”,@“age”,nil];
NSLog( @“%@“,dict1);
注意事项: 1. 创建时value在前,key在后
// 2. 字典是无序的
// 3. 字典在创建的时候也是以 nil 结束
// 4. key值一般是字符串,value必须是对象

// 使用便利构造器创建
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@”bear”,@”baidu”,@”qq”,@”tencent”,@”dog”,@”jingdong”,nil];
NSLog(@”%@”,dict2);

// 字典的访问// 获取字典中所有的key值NSArray *kArr = [dict2 allKeys];NSLog(@"%@",kArr);// 获取字典中所有的value值NSArray *vArr = [dict2 allValues];NSLog(@"%@",vArr);// 获取字典中的键值对个数NSUInteger count3 = [dict2 count];NSLog(@"%lu",count3);//根据key值返回value值NSString *sValue = [dict2 objectForKey:@"baidu"];NSLog(@"%@",sValue);

// 便利这个字典的键值对
// 方法一:
for (int i = 0; i < count3 ; i++) {
// key值的个数和键值对的个数是一致的
// [dict2 allKeys]返回存放所有的key的数组
NSString *key = [[dict2 allKeys] objectAtIndex:i];
NSString *value = [dict2 objectForKey:key];
NSLog(@”%@ = %@”,key,value);
}
// 方法二:
for (NSString *key1 in [dict2 allKeys]) {
NSString *value = [dict2 valueForKey:key1];
NSLog(@”%@ = %@”,key1,value);
}
// 方式三:
// 使用快速枚举遍历字典,默认遍历的是字典的key值
for (NSString *key in dict2) {
NSString *value = [dict2 objectForKey:key];
NSLog(@”%@ = %@”,key,value);
}

// 可变字典 NSMutableDictionary 继承自NSDictionary,管理的是可变的字典

NSMutableDictionary *mDict = [[NSMutableDictionary  alloc]initWithCapacity:0];[mDict setObject:@"luyang" forKey:@"H"];[mDict setObject:@"chaoyang" forKey:@"Z"];//  修改同一个key值所对应的value[mDict setObject:@"ziqian" forKey:@"Z"];// setObject:forKey: 这个方法,如果发现字典没有对应的key值。此时向字典里添加一对键值,如果字典有有对应的key值,此时就修改key值对应的value值  (有就修改,没有就添加)NSLog(@"%@",mDict);// 删除键值对:// 根据key值删除键值对[mDict removeObjectForKey:@"Z"];NSLog(@"%@",mDict);// 清空字典[mDict removeAllObjects];NSLog(@"%@",mDict);NSArray *group1 = [NSArray arrayWithObjects:@"xiaohua",@"xiaoming",@"xiaokang",nil];NSArray *group2 = [NSArray arrayWithObjects:@"cuihua",@"dachui",@"gangdan",nil];NSArray *group3 = [NSArray arrayWithObjects:@"sanpang",@"aobama",@"anpei",nil];NSMutableDictionary *groupDic = [NSMutableDictionary dictionaryWithCapacity:3];// 数组作为key值对应value值[groupDic setObject:group1 forKey:@"1"];[groupDic setObject:group2 forKey:@"2"];[groupDic setObject:group3 forKey:@"3"]; NSLog(@"%@",groupDic);

// ——————————————————————————————————————//

集合 NSSet 是一个不可变的集合类,继承自NSObject,用于解决类似于数学中集合的问题

注意:1.集合中的元素是唯一的,重复的不能别识别
2.集合中的元素是无序的

NSArray *sArr = [NSArray arrayWithObjects:@”1”,@”2”,@”3”,@”4”,@”2”,@”1”,nil];
// 使用数组初始化集合
// 把数组转为集合,可以把数组中重复的元素排除掉,
NSSet *set2 = [[NSSet alloc]initWithArray:sArr];
NSLog(@”%@”,set2);

// 访问集合中的元素// 获取集合中与元素的个数NSUInteger count4 = [set2 count];NSLog(@"%lu",count4);// 随机访问集合中元素NSString *sObject = [set2 anyObject];NSLog(@"%@",sObject);// 判断集合中是否包含某个对象BOOL isContain = [set2 containsObject:@"1"];NSLog(@"%@",isContain ? @"包含" : @"不包含");NSSet *set3 = [NSSet setWithObjects:@"1",@"2",@"3",@"4",@"5", nil];NSSet *set4 = [NSSet setWithObjects:@"1",@"2",@"3", nil];// 判断一个集合是否是另一个集合的子集  (前面的是否是后面的子集)BOOL isTure = [set4 isSubsetOfSet:set3];NSLog(@"%@",isTure ? @"是子集" : @"不是子集");// 判断两个集合是否有交集isTure = [set3 intersectsSet:set4];NSLog(@"%@",isTure ? @"有交集" :@"没交集");// 判断两个集合是否相等isTure = [set3 isEqualToSet:set4];NSLog(@"%@",isTure? @"相等" :@"不相等");// NSMutableSet  可变集合//NSMutableSet *mSet = [[NSMutableSet alloc]initWithCapacity:0];NSMutableSet *mSet1 = [NSMutableSet setWithCapacity:0];// 添加一个元素[mSet1 addObject:@"dd"];[mSet1 addObject:@"ff"];NSLog(@"%@",mSet1);// 删除元素[mSet1 removeObject:@"dd"];NSLog(@"%@",mSet1);// 删除所有元素[mSet1 removeAllObjects];NSLog(@"%@",mSet1);// 总结:NSArray NSDictionary NSSet 三种集合

/*
NSArray 集合的特点:

 1. NSArray都是有序的,NSDictionary和NSSet是无序的 2. NSArray能通过下标访问,NSDictionary是通过key来访问元素,NSSet随机访问 3. NSArray的元素可以重复,NSDictionary中的不可以重复,必须唯一,NSSet中元素也是唯一,即使重复也无效 4. 显示格式:NSArray:(元素1,元素2,···元素N,nil)            NSDictionary:{key1 = value1; key2 = value2····keyN = valueN}            NSSet: {(元素1,元素2····元素N)} 5. 注意: NSArray 和 NSDictionary 经常嵌套使用

*/

// NSNumber 继承自NSValue,数字类,主要作用是将基本数据类型转换为对象类型,也能将对象转化为基本数据类型

// 100// 将int类型数据转换为NSNumber对象NSNumber *intNumber = [NSNumber numberWithInt:100];NSLog(@"%@",intNumber);int a = [intNumber intValue];NSLog(@"%d",a);   // %i  也能打印int类型数据,老版本写法// 3.14NSNumber *floatNumber = [NSNumber numberWithFloat:3.14];NSLog(@"%@",floatNumber);// 将NSNumber转为基本数据类型float f = [floatNumber floatValue];NSLog(@"%.2f",f);// 练习:short 10NSNumber *shortNumber = [NSNumber numberWithShort:10];NSLog(@"%@",shortNumber);short s = [shortNumber shortValue];NSLog(@"%hd",s);// NSInteger 100NSNumber *IntegerNmuber = [NSNumber numberWithInteger:10];NSLog(@"%@",intNumber);     //  注意: 这里是intNumber  用的不是INtegerNumberNSInteger aa = [IntegerNmuber integerValue];NSLog(@"%ld",aa);// 总结: 基本数据类型转换为对象类型(提供的是什么类型数据,此时就使用 [NSNumber numberWith后跟上相应的基本数据类型名])// 转为基本数据类型的方法:[NSNumber对象 基本数据类型名+Value]
0 0