目录:
- 1.集合类简介
- 2.NSArray(不可变数组)
- 3.NSMutableArray (可变数组)
- 4.NSDictionary
- 5.NSMutableDictionary
- 6.字典的遍历
- 7.NSSet(集)
一、集合类简介
在C语言阶段大家听到集合类,肯定会想到数组,但是在OC语言的集合不在是单纯的数组,而是分为三大类:数组NSArray,字典NSDictionary,集NSSet;平常使用的集合都是这3类,或者他们的子类;
OC集合类的特点
1.所有集合都是对象;
2.集合中的元素都是对象,而且只能是对象;
3.简单数据类型用NSNumber封装成对象,复杂数据类型用NSValue封装;
4.集合中不能存放nil空对象,nil是作为集合结束标识符;
5.OC集合没有多维的概念,也就是不会出现根本意义上的二维数组,我们可以简单的这样理解:在数组中存放了一个对象,这个对象是数组;
6.集合的所有运算依赖于方法,但是多数情况下依旧要使用循环。
二、NSArray
NSArray介绍
1.OC中数组分为不可变数组(NSArray)和可变数组(NSMutableArray) ,且只能存储Object-C对象
2.NSArray是不可变数组,数组存放的对象个数和每个对象都不可改。
3.只能装对象,基本数据类型封装成NSNumber,复杂类型封装成NSValue;
4.以nil作为结束标志,初始化中不能包含空对象;
5.数组中的元素不一定为一个类型,可以NSString,NSNumber
6.下表从0开始
NSArray 和NSString一样是不可变,他的操作不再原数组上进行,通过返回一个新数组来操作,接下来我们看看NSArray的一些方法
1.初始化方法
//实例方法初始化:initWith....
NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSArray *array2 = [[NSArray alloc] initWithArray:array1];
//便利初始化方法:arrayWith....
NSArray *array3 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *array4 = [NSArray arrayWithArray:array3];
//简化操作:@[]
NSArray *array5 = @[@"1",@"2",@"3"];
2.获取数组元素个数
NSArray *array5 = @[@"1",@"2",@"3"];
NSInteger count = [array5 count];
NSLog(@"count = %ld",count);
3.数组的常用方法
1.添加元素
NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSArray *addArray = [array1 arrayByAddingObject:@"4"];
NSArray *addArray1 = [array1 arrayByAddingObjectsFromArray:array3];
NSLog(@"addArray = %@,addArray1 = %@",addArray,addArray1);
2.查找元素
NSArray *array3 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSInteger index = [array3 indexOfObject:@"3"];
if (index == NSNotFound) {
NSLog(@"没有这个对象");
} else {
NSLog(@"找到对象了:%ld", index);
}
3.获取元素
存入是什么类型,取出的时候,就需要什么类型去接受
//根据索引:objectAtIndex,arr[i]
NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSString *getString1 = array1[0];
NSString *getString2 = [array1 objectAtIndex:0];
NSLog(@"getString:%@,%@",getString1,getString2);
//获取第一个: firstObject
NSString *getString3 = [array1 firstObject];
//获取最后一个:lastObject
NSString *getString4 = [array1 lastObject];
NSLog(@"%@,%@",getString3,getString4);
//获取部分元素:subarrayWithRange...
NSArray *getArray = [array1 subarrayWithRange:NSMakeRange(0, 2)];
NSLog(@"getArray = %@",getArray);
4.排序
NSOrderedSame; 0 相等
NSOrderedDescending; -1 降序
NSOrderedAscending; 1 升序
//sortedArrayUsingSelector:@selector(compare:):他是以字符串(ASCII)的形式比较大小的
NSArray *sortArray = @[@"3",@"7",@"5"];
NSArray *sortArray1 = [sortArray sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"sortArray = %@",sortArray1);//3,7,5
//如果我在数组里面我加了一个17,如果用上面的方式,结果是:17,3,5,7,解决方法是将其转变为interger或int类型比较,方法:sortedArrayUsingComparator
NSArray *sortArray = @[@"3",@"7",@"5",@"17"];
NSArray *sortArray2 = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id __nonnull obj1, id __nonnull obj2) {
NSInteger a = [obj1 integerValue];
NSInteger b = [obj2 integerValue];
if (a == b) {
return 0;
}else if (a > b){
return 1;
}else{
return -1;
}
}];
NSLog(@"sortArray2 = %@",sortArray2);
//结果:3,5,7,17
有人可能会问,那我想从大到小呢:只需改一下return后面的数
NSArray *sortArray2 = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id __nonnull obj1, id __nonnull obj2) {
NSInteger a = [obj1 integerValue];
NSInteger b = [obj2 integerValue];
if (a == b) {
return 0;
}else if (a > b){
return -1;
}else{
return 1;
}
}];
NSLog(@"sortArray2 = %@",sortArray2);
//结果:17,7,5,3
5.数组的遍历
//一般遍历方法
NSArray *newArray = @[@"2",@"5",@"1",@"8",@"4"];
for (int i = 0; i < [newArray count]; i ++) {
NSLog(@"newArray = %@",[newArray objectAtIndex:i]);
}
//快速枚举
for (id obj in newArray) {
NSLog(@"obj = %@",obj);
}
三、NSMutableArray(可变数组)
可变数组NSMutableArray,继承自NSArray,拥有父类的全部特性;
NSMutableArray的方法,直接对数组自身进行操作,没有返回值。
1.初始化
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"3",@"7",@"6",@"5", nil];
NSMutableArray *mutableArray1 = [NSMutableArray arrayWithObjects:@"2",@"4",@"7", nil];
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:20];//给它分配容量大小
2.方法运算
1.增
NSMutableArray *mutableArray1 = [NSMutableArray arrayWithObjects:@"2",@"4",@"7", nil];
[mutableArray1 addObject:@"0"];
NSLog(@"mutableArray1 = %@",mutableArray1);
2.删
[mutableArray1 removeObject:@"2"];
NSLog(@"remove = %@",mutableArray1);
3.查
NSInteger index1 = [mutableArray1 indexOfObject:@"0"];
NSLog(@"index1 = %ld",index1);
4.改(替换)
[mutableArray1 replaceObjectAtIndex:2 withObject:@"1"];
NSLog(@"replace = %@",mutableArray1);
5.排序: sort...
NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"1",
@"3",
@"2",nil];
[arr2 sortUsingSelector:@selector(compare:)];
NSLog(@"%@", arr2);
四、NSDictionary(字典)
存储方式为通过 键-值 对(key - value)的方式来存放数据的一种无序集合。
字典使用的是键查询的优化存储方式。它可以立即找出要查询的数据,而不需要遍历整个数组进行查找。
一般通过key来操作object。某种意义上,对字典的运算实际上就是对key值的运算。
字典分为不可变字典NSDictionary和可变字典NSMutableDictionary。
1.初始化
//一般初始化方法(value:key)
NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",nil];
//便利初始化方法
NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:@"one",@"1",@"two",@"2", nil];
NSLog(@"dic:%@,%@",dictionary,dictionary1);
//字典的快速生成:@{key - value}
NSDictionary *dictionary2 = @{@"1":@"one",
@"2":@"two"};
NSLog(@"dic2 = %@",dictionary2);
2.查询一个对象(通过key)
id object = [dictionary2 objectForKey:@"2"];
NSLog(@"object = %@",object);
3.取出所有的key
NSArray *keys = [dictionary2 allKeys];
4.取出所有的对象
NSArray *objects = [dictionary2 allValues];
NSLog(@"keys = %@,objects = %@",keys,objects);
*
注意:键不可以重复,值可以 当设置的key值与原有key值重复时,会直接覆盖原来的键值对,这 也是更改字典数据的方法。
*
五、NSMutableDictionary(可变字典)
1.初始化
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"three",@"3",@"four",@"4", nil];
2.增
[mutableDictionary setObject:@"six" forKey:@"6"];
NSLog(@"addDic:%@",mutableDictionary);
3.删
[mutableDictionary removeObjectForKey:@"6"];
NSLog(@"%@",mutableDictionary);
4.查
id obj1 = [mutableDictionary objectForKey:@"4"];
NSLog(@"%@",obj1);
5.改(根据key将原来的覆盖掉)
[mutableDictionary setObject:@"sunny" forKey:@"4"];
NSLog(@"change = %@",mutableDictionary);
六、字典的遍历
因为字典是以key-value形式存在,所以不可以直接遍历出一对,只能通过keys
//for循环遍历
NSDictionary *newDictionary = @{@"1":@"one",
@"2":@"two",
@"3":@"three",
@"4":@"four"};
NSArray *allKeys = [newDictionary allKeys];
//根据key,遍历所有的value
for (int j = 0; j < [allKeys count]; j ++) {
NSString *key = [allKeys objectAtIndex:i];
NSLog(@"%@", [dic objectForKey:key]);
}
// 快速枚举
for (id key in dic1) {
//快速枚举字典拿到的是key
NSLog(@"%@", [dic1 objectForKey:key]);
}
七、 NSSet(集)
完全无序
里面的对象不能存放重复对象主要用于去除重复数
NSSet对象中不能存放重复对象,如果出现重复,最终只会保留一个,NSSet也常用来清除其他集合中的重复对象
//初始化
NSSet *set = [NSSet setWithObjects:@"1",@"2",@"3",@"4", nil];
//取出一个
id obi2 = [set anyObject];
//取所有的对象
NSArray *setArray = [set allObjects];
NSLog(@"%@,setArray = %@",obi2,setArray);
//去除重复数
NSArray *setArray1 = @[@"1",@"2",@"3",@"4",@"4",@"3"];
NSSet *set1 = [NSSet setWithArray:setArray1];
NSArray *setArray2 = [set1 allObjects];
NSLog(@"setArray2 = %@",setArray2);