您的位置:首页 > 移动开发 > IOS开发

iOS——之数组 字典 枚举

2015-12-28 20:19 495 查看
// 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.14

NSNumber *floatNumber = [NSNumber numberWithFloat:3.14];
NSLog(@"%@",floatNumber);

// 将NSNumber转为基本数据类型
float f = [floatNumber floatValue];
NSLog(@"%.2f",f);

// 练习:short 10

NSNumber *shortNumber = [NSNumber numberWithShort:10];
NSLog(@"%@",shortNumber);

short s = [shortNumber shortValue];
NSLog(@"%hd",s);

// NSInteger 100
NSNumber *IntegerNmuber = [NSNumber numberWithInteger:10];
NSLog(@"%@",intNumber);     //  注意: 这里是intNumber  用的不是INtegerNumber

NSInteger aa = [IntegerNmuber integerValue];
NSLog(@"%ld",aa);

// 总结: 基本数据类型转换为对象类型(提供的是什么类型数据,此时就使用 [NSNumber numberWith后跟上相应的基本数据类型名])
// 转为基本数据类型的方法:[NSNumber对象 基本数据类型名+Value]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: