1.oc中常用的容器: 1.NSArray 数组 2.NSDictionary 字典 3.NSSet集
2.NSArray数组:继承自NSObject 是不可变的,用于管理一系列对象的一个有序的集合。注意:数组只能存放对象类型
3.创建一个数组对象
(1)创建的是一个空数组
虽然数组中存储的内容不可修改,但是数组指针是可以重指向的
NSArray *arr = [[NSArray alloc]init];
NSArray *arr1 = [NSArray array];
NSArray *arr1 = [NSArray array];
NSLog(@"arr =%@arr1 = %@",arr,arr1);//打印数组的标记是一对小括号
(2)创建拥有对象的数组
nil是一个数组定义结束的标准,数组中只能装对象,数组中打汉字是打不出来的,只能打出\u;想打出汉字,单独打印数组中的元素,如果是中文的可以正常输出,如果打印的是数组对象,是不能把数组中存储的中文正常输出的
NSArray *arr2 = [[NSArray alloc]initWithObjects:@"张宇",@"2",@"3" ,nil];
NSLog(@"%@",arr2);
NSLog(@"%@",arr2);
NSLog(@"%@",arr2[0]);
(3)使用便利构造器创建数组
NSArray *arr3 = [NSArray arrayWithObjects:@"zuoZhu",@"xiaoYing",@"MingRen",@"chuTian", nil];
NSLog(@"%@",arr3);
NSLog(@"%@",arr3);
(4)用一个已经存在的数组,初始化另一个数组
NSArray *arr4 = [[NSArray alloc]initWithArray:arr3];
NSLog(@"==%@",arr4);
NSArray *arr5 = [NSArray arrayWithArray:arr4];
NSLog(@"===%@",arr5);
NSLog(@"==%@",arr4);
NSArray *arr5 = [NSArray arrayWithArray:arr4];
NSLog(@"===%@",arr5);
(5)如何访问数组中的元素
获取数组元素的个数
NSUInteger count = [arr5 count];
NSLog(@"%lu",count);
NSLog(@"%lu",count);
(6)根据下标获取数组中对应的元素
NSLog(@"%@",arr5[0]);
(7)访问数组中的第一个元素
NSLog(@"%@",[arr5 firstObject]);
(8)访问数组中的最后一个元素
NSLog(@"%@",[arr5 lastObject]);
(9)返回给定位置得对象
id object = [arr5 objectAtIndex:2];
如果你不知道数组中存放的是什么类型对象使用
id
类型的对象区接收
NSLog(@"%@",object);
NSString *object3 =object;可以将id类型对象转换为想要的类型
NSString *object2 =[arr5 objectAtIndex:1];
如果知道数组中存放的是什么类型对象,最好就是用哪个类型的对象区接收
NSLog(@"%@",object);
(10)NSMutableArray 继承NSArray是一组能够改变元素的数组
创建可变数组对象
NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:0];
NSMutableArray *marr1 = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *marr1 = [NSMutableArray arrayWithCapacity:0];
NSLog(@"marr=%@marr1%@",mArr,marr1);
(11)向可变数组添加元素
[marr1 addObject:@"songxiaobao"];
[marr1 addObject:@"zhaosi"];
[marr1 addObject:@"xiaoshenyang"];
NSLog(@"%@",marr1);
[marr1 addObject:@"zhaosi"];
[marr1 addObject:@"xiaoshenyang"];
NSLog(@"%@",marr1);
(12)添加多个数组
NSArray *arr6 = [NSArray arrayWithObjects:@"chengxuyuan",@"shejishi",@"changpingou",@"yunyingshi",@"kefuniu",@"zongjingli", nil];
NSMutableArray *marr2 = [NSMutableArray arrayWithCapacity:0];
(13)一个数组向可变数组中添加元素
[marr2 addObjectsFromArray:arr6];
NSLog(@"%@",marr2);
NSMutableArray *mArr3 = [NSMutableArray arrayWithCapacity:0];
mArr3 = [NSMutableArray arrayWithObjects:@"zhangyu",@"xiaopang",nil];
NSLog(@"%@",mArr3);
NSLog(@"%@",marr2);
NSMutableArray *mArr3 = [NSMutableArray arrayWithCapacity:0];
mArr3 = [NSMutableArray arrayWithObjects:@"zhangyu",@"xiaopang",nil];
NSLog(@"%@",mArr3);
(14)向某个位置插入一个元素
[mArr3 insertObject:@"siyuan" atIndex:1];
NSLog(@"%@",mArr3);
(15)交换两个位置的元素
[mArr3 exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"%@",mArr3);
//
NSMutableArray *mArr4 = [[NSMutableArray alloc]initWithObjects:@"shibo",@"zhangqiang",@"zhangyu",@"lanlan",@"lanlan", nil];
NSLog(@"%@",mArr3);
//
NSMutableArray *mArr4 = [[NSMutableArray alloc]initWithObjects:@"shibo",@"zhangqiang",@"zhangyu",@"lanlan",@"lanlan", nil];
(16)删除指定的对象
[mArr4 removeObject:@"lanlan"];
NSLog(@"%@",mArr4);
(17)删除给定下标的元素
[mArr4 removeObjectAtIndex:0];
NSLog(@"%@",mArr4);
(18)删除数组中最后一个元素
[mArr4 removeLastObject];
NSLog(@"%@",mArr4);
(19)删除数组中所有的元素
[mArr4 removeAllObjects];
NSLog(@"%@",mArr4);
NSMutableArray *mArr5 = [NSMutableArray arrayWithObjects:@"zhangyu",@"xibo",@"gaofei",@"zhaoyonghong",nil];
NSUInteger count1 = [mArr5 count];
(20)遍历这个数组
for (int i = 0; i < count1; i++) {
// NSString *string1 = mArr5[i];
NSLog(@"%@",mArr5[i]);
}
// NSString *string1 = mArr5[i];
NSLog(@"%@",mArr5[i]);
}
(21)快速枚举forin
for(集合中的对象类型 in 集合的类型){
循环体
}
(22)oc中提供的快速枚举遍历集合时不需要在关心集合中元素的个数,集合的个数有方法做内部处理
每一次循环都把找到的元素赋值给我们提供的变量(比如:NSString *string)
此时,就可以在循环体内对找到对象做一些处理(比如:打印)
注意:在快速枚举的过程中,不能对数组做任何处理(比如:删除)
for (NSString *string in mArr5) {
// [mArr5 removeLastObject];不能添加,这样是错误的!!!!!
NSLog(@"===%@",string);
}
// [mArr5 removeLastObject];不能添加,这样是错误的!!!!!
NSLog(@"===%@",string);
}
//创建四个人得对象
Person *p = [Person personWithName:@"changlaoshi" sex:@"woman"];
Person *p1 = [Person personWithName:@"jizemingmu" 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);
}
Person *p = [Person personWithName:@"changlaoshi" sex:@"woman"];
Person *p1 = [Person personWithName:@"jizemingmu" 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);
}
(23)数组中的排序
NSMutableArray *mArr6 = [NSMutableArray arrayWithObjects:@"zhangyu",@"xibo",@"gaofei",@"zhaoyonghong",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] ]== NSOrderedDescending) {
[mArr6 exchangeObjectAtIndex:j withObjectAtIndex:j+1]; }
}
}
for (NSString *string in mArr6) {
NSLog(@"%@",string);
for (int i = 0; i < count2-1; i++) {
for (int j = 0; j<count2-i-1; j++) {
if ([mArr6[j] compare:mArr6[j+1] ]== NSOrderedDescending) {
[mArr6 exchangeObjectAtIndex:j withObjectAtIndex:j+1]; }
}
}
for (NSString *string in mArr6) {
NSLog(@"%@",string);
}
OC中数组排序
sel =@selector他是一个方法选择器@selector()小括号中只需要提供比较元素大小的方法就可以了
//sortedArrayUsingSelector返回的是一个升序的数组
//sortedArrayUsingSelector返回的是一个升序的数组
NSArray *sortArray = [mArr6 sortedArrayUsingSelector:(@selector(compare:))];
for (NSString *string in sortArray) {
NSLog(@"%@",string);
}
for (NSString *string in sortArray) {
NSLog(@"%@",string);
}
4.字典NSDictionary继承的NSObject,是一个不可变的字典,字典中存储的元素,都是以键值(key - -value)对形式出现,并且key值是唯一的,不能重复
a.字典中只能存放对象类型的数组,且字典中存放的键值对是无序的
b.存放数据的形式:key:value1,key:value2....
c.key=键 value = 值 俗称键值对
d.key是唯一的,但是value是可以有多个的
(1)创建一个空字典
NSDictionary *dict =[[NSDictionary alloc]init];
//打印字典的标准时一对大括号{}
NSLog(@"%@",dict);
//打印字典的标准时一对大括号{}
NSLog(@"%@",dict);
(2)创建一个字典
NSDictionary *dict1 =[[NSDictionary alloc]initWithObjectsAndKeys:@"zhangsan",@"name",@"yao",@"sex",@"38",@"age", nil];
NSLog(@"%@",dict1);
注意事项:
a.创建时value在前,key在后
b.字典是无序的
c.字典在创建的时候也是nil
d.key一般是字符串,value必须是对象
NSDictionary *dict2 = [[NSDictionary alloc]initWithObjectsAndKeys:@"bear",@"baidu",@"qq",@"tengxun",@"dog",@"jingdong", nil];
NSLog(@"%@",dict2);
NSDictionary *m =[NSDictionary dictionaryWithObjectsAndKeys:@"bear",@"baidu",@"qq",@"tengxun",@"dog",@"jingdong", nil];
NSLog(@"%@",m);
NSLog(@"%@",dict2);
NSDictionary *m =[NSDictionary dictionaryWithObjectsAndKeys:@"bear",@"baidu",@"qq",@"tengxun",@"dog",@"jingdong", nil];
NSLog(@"%@",m);
(3)字典的访问
获取字典中所有的key值
NSArray *kArr = [dict2 allKeys];
NSLog(@"%@",kArr);
(4)获取字典中所有的value
NSArray *vArr = [dict2 allValues];
NSLog(@"%@",vArr);
(5)获取字典中的键值个数
NSUInteger count3 = [dict2 count];
NSLog(@"%lu",count3);
NSLog(@"%lu",count3);
(6)根据key返回value值
NSString *sValue = [dict2 objectForKey:@"baidu"];
NSLog(@"%@",sValue);
(7)遍历字典的键值对
方法一
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);
//key值的个数和键值对的个数是一致的
//[dict2 allKeys]返回存放所有key的数组
NSString *key = [[dict2 allKeys] objectAtIndex:i];
NSString *value = [dict2 objectForKey:key];
NSLog(@"%@ = %@",key,value);
}
方法二
for (NSString *key in [dict2 allKeys]) {
//根据key值拿到value值
NSString *value = [dict2 valueForKey:key];
NSLog(@"%@ = %@",key,value);
}
//根据key值拿到value值
NSString *value = [dict2 valueForKey:key];
NSLog(@"%@ = %@",key,value);
}
方法三
//使用快速枚举遍历字典,默认辨认是key值
for (NSString *key in dict2) {
NSString *value = [dict2 objectForKey:key];
NSLog(@"%@ == %@",key,value);
}
for (NSString *key in dict2) {
NSString *value = [dict2 objectForKey:key];
NSLog(@"%@ == %@",key,value);
}
5.可变字典NSMutableDictionary 继承的NSDictionary,管理的是可变字典
NSMutableDictionary *mDict =[[NSMutableDictionary alloc]initWithCapacity:0];
[mDict setObject:@"luyang" forKey:@"H"];
[mDict setObject:@"zhangyu" forKey:@"Z"];
//改
[mDict setObject:@"ziqian" forKey:@"Z"];//setObject:forkey:这个方法,如果发现字典中没有对应的key值,此时向字典中添加一对键值;如果字典中有对应的key值,此时,就修改key值对应的value值
NSLog(@"%@",mDict);
[mDict setObject:@"luyang" forKey:@"H"];
[mDict setObject:@"zhangyu" forKey:@"Z"];
//改
[mDict setObject:@"ziqian" forKey:@"Z"];//setObject:forkey:这个方法,如果发现字典中没有对应的key值,此时向字典中添加一对键值;如果字典中有对应的key值,此时,就修改key值对应的value值
NSLog(@"%@",mDict);
(1)根据key值删除键值对
[mDict removeObjectForKey:@"Z"];
NSLog(@"%@",mDict);
(2)清空字典
[mDict removeAllObjects];
NSLog(@"%@",mDict);
(3) NSArray *grop1 = [NSArray arrayWithObjects:@"xiaohua",@"xiaoming",@"xiaokang", nil];
NSArray *grop2 = [NSArray arrayWithObjects:@"zhangyu",@"xiaopang",@"gaofei", nil];
NSArray *grop3 = [NSArray arrayWithObjects:@"zhongguo",@"meiguo",@"chaoxian", nil];
NSMutableDictionary *gropDic = [NSMutableDictionary dictionaryWithCapacity:3];
//数组作为key值对应value值
[gropDic setValue:grop1 forKey:@"1"];
[gropDic setValue:grop2 forKey:@"2"];
[gropDic setValue:grop3 forKey:@"3"];
NSArray *grop2 = [NSArray arrayWithObjects:@"zhangyu",@"xiaopang",@"gaofei", nil];
NSArray *grop3 = [NSArray arrayWithObjects:@"zhongguo",@"meiguo",@"chaoxian", nil];
NSMutableDictionary *gropDic = [NSMutableDictionary dictionaryWithCapacity:3];
//数组作为key值对应value值
[gropDic setValue:grop1 forKey:@"1"];
[gropDic setValue:grop2 forKey:@"2"];
[gropDic setValue:grop3 forKey:@"3"];
NSLog(@"%@",gropDic);
6.NSSet 不可变的集合类,继承NSObject用于解决类似于数学中集合的问题;
注意:集合中的元素是唯一的 集合中的元素是无序的 集合中只能存放对象类型数据
(1)创建一个空集合
NSSet *set = [[NSSet alloc]init];
NSLog(@"%@",set);
NSSet *set1 = [[NSSet alloc]initWithObjects:@"1",@"2",@"1",@"3",@"4",@"5", nil];
NSLog(@"%@",set1);
NSLog(@"%@",set);
NSSet *set1 = [[NSSet alloc]initWithObjects:@"1",@"2",@"1",@"3",@"4",@"5", nil];
NSLog(@"%@",set1);
(2)使用数组初始化集合
NSArray *sArr = [NSArray arrayWithObjects:@"1",@"2",@"2",@"1",@"3",@"4",@"5", nil];
(3)使用数组初始化集合 把数组转为集合,可以吧数组中重复的元素除掉
NSSet *set2 = [[NSSet alloc]initWithArray:sArr];
NSLog(@"%@",set2);
(4)访问集合中元素的个数
NSUInteger count4 = [set2 count];
NSLog(@"%lu",count4);
(5)随机访问集合中元素
NSString *sObject = [set2 anyObject];
NSLog(@"%@",sObject);
(6)判断集合中是否包含某个对象
BOOL isContain = [set2 containsObject:@"0"];
NSLog(@"%@",isContain ? @"包含" : @"不包含");
NSLog(@"%@",isContain ? @"包含" : @"不包含");
(7)判断一个集合是否是另一个集合的子集
NSSet *set3 = [NSSet setWithObjects:@"1",@"2",@"3",nil];
NSSet *set4 = [NSSet setWithObjects:@"1",@"2",@"3",nil];
BOOL isTrue =[set4 isSubsetOfSet:set3];
NSLog(@"%@",isTrue ? @"是它的子集" : @"不是它的子集");
(8)判断两个集合是否有交集
isTrue = [set3 intersectsSet:set4];
NSLog(@"%@",isTrue ? @"有交集" : @"没有交集");
(9)判断两个集合是否相等
isTrue = [set3 isEqualToSet:set4];
NSLog(@"%@",isTrue ? @"相等" : @"不相等");
7. 可变集合 NSMutableSet
NSMutableSet *mSet =[[NSMutableSet alloc]initWithCapacity:0];
NSMutableSet *mSet1 =[NSMutableSet setWithCapacity:0];
(1)添加元素
[mSet addObject:@"1"];
[mSet addObject:@"2"];
NSLog(@"%@",mSet);
[mSet addObject:@"2"];
NSLog(@"%@",mSet);
(2)删除元素
[mSet removeObject:@"1"];
NSLog(@"%@",mSet);
NSLog(@"%@",mSet);
(3)删除集合中所有的元素
[mSet removeAllObjects];
NSLog(@"%@",mSet);
总结: 1.NSArray 数组 2.NSDictionary 字典 3.NSSet集
1.NSArray
是有序的,
NSDictionary
,
NSSet
是无序的
2.NSArray能通过下标访问,NSDictionary 通过key类访问元素 NSSte随机访问
3.NSArray
的元素可以重复,
NSDictionary
中的
key
值必须唯一,
NSSet
元素也是唯一的
4.
显示格式:
NSArray
:(元素
1
,元素
2.....
)
NSDictionary :{key1 = value1
;
key2 =value2}
NSSet : { (元素 1 ,元素 2......... ) }
NSSet : { (元素 1 ,元素 2......... ) }
注意:NSArray和NSDictionary经常嵌套使用
8. NSNumber继承NSvalue是一个数字类,主要作用是讲基本数据类型转换为对象类型,也能就将对象类型转换为基本数据类型
//将int数据类型转换成NSNumber对象
NSNumber *intNumber = [NSNumber numberWithInt:100];
NSLog(@"%@",intNumber);
//
int a = [intNumber intValue];
NSLog(@"%i",a);//%i也是int类型的占位符
//3.14
NSNumber *floatNumber =[NSNumber numberWithFloat:3.14];
NSLog(@"%@",floatNumber);
float f = [floatNumber floatValue];
NSLog(@"%.2f",f);
NSNumber *shortNumber = [NSNumber numberWithShort:2];
NSLog(@"%@",shortNumber);
short d =[shortNumber shortValue];
NSLog(@"%hd",d);
//基本数据类型转换对象类型(提供是神马类型数据,此时使用【NSNumber numberWith后跟上相应的基本数据类型名