数组(NSArray)
Foundation中的数组是一组有序的对象集合,通过索引下标获取到数组中的元素。数组中不可以存放基本数据类型,只能存放实例(对象)。同样,数组也分为可变 (NSArray) 和不可变 (NSMutbleArray) 两种。
不可变数组(NSArray)
1.初始化
//创建一个空数组。
NSArray *array = [NSArray array];
//创建一个只有一个元素的数组。
NSArray *array1 = [NSArray arrayWithObject:@"one"];
//多个元素数组初始化时,以 nil 作为数组结束。
NSArray *array2 = [NSArray arrayWithObjects:@"one",@"two",nil];
可变数组(NSMutableArray)
1.初始化
//创建一个元素个数为 5 的可变数组,元素个数创建后可修改。
NSMutableArray *mArray1 = [NSMutableArray arrayWithCapacity:5];
//创建一个有 2 个元素的可变数组,以 nil 作为数组结束。
NSMutableArray *mArray2 = [NSMutableArray arrayWithObjects:@"one",@"two", nil];
2.向数组中添加元素
[mArray2 addObject:@"three"];
3.向数组中插入元素
//从数组第 3 个元素处开始插入
[mArray2 insertObject:@"four" atIndex:3];
4.删除书中最后一个元素
[mArray2 removeLastObject];
5.删除指定的数组元素
[mArray2 removeObject:@"one"];
6.删除指定下标的元素
//删除数组中索引为 0 的元素
[mArray2 removeObjectAtIndex:0];
7.向数组中添加数组
[mArray1 addObjectsFromArray:mArray2];
8.替换数组中指定的下标元素
//使用元素 one 替换数组 mArray1 中第 0 个元素
[mArray1 replaceObjectAtIndex:0 withObject:@"one"];
9.删除数组中的所有元素
[mArray1 removeAllObjects];
数组的基本用法
1.获取数组中的元素个数
int count = [array count];
2.根据数组下标获取数组中的元素
NSString *string = [array objectAtIndex:0];
3.获取数组中的最后一个元素
NSString *last = [array lastObject];
4.获取指定元素的索引
int index = [array indexOfObject:@"a"];
5.判断数组中是否包含了某个元素
if ([array containsObject:@"a"]) {
NSLog(@"数组包含了字符串a");
}
6.用指定的字符串,将数组中的元素连接起来
NSString *arrstr = [array componentsJoinedByString:@","];
7.将一个数组写入文件中
NSString *path = @"/Users/Jayden/Development/array.xml";
[array writeToFile:path atomically:YES];
8.从文件中读取数组
//根据文件创建数组,path 为文件路径。
NSArray *array3 = [NSArray arrayWithContentsOfFile:path];
遍历数组
1.基础遍历方法
这种方法是最基础的利用 for 循环进行遍历的,这种方法效率一般,但是方便针对下标进行处理。
NSArray *strArray = [NSArray arrayWithObjects:@"1", @"6", @"3", @"10", @"s31", nil];
for (int i = 0; i < strArray.count; i++) {
NSLog(@"strArray:%@",strArray[i]);
}
2.快速遍历
快速遍历代码简洁清晰,效率高。
//正向遍历
for (id object in strArray3){
NSLog(@"strArray3:%@",object);
}
//逆向遍历
for (id object in [strArray3 reverseObjectEnumerator]){
NSLog(@"strArray3:%@",object);
}
3.利用 Block 遍历
block 里面的参数包括元素 object,下标 index 以及是否停止遍历,这种遍历方法,有下标,元素对象,以及是否继续遍历的标志,能满足基本所有的遍历需求。
//正向遍历
[strArray3 enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop){
NSLog(@"strArray3:%@", object);
}];
//逆向遍历
[strArray3 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id object, NSUInteger index, BOOL *stop){
NSLog(@"strArray3:%@", object);
}];
数组排序
1.字符串数组简单排序(sortedArrayUsingSelector:)
sortedArrayUsingSelector()函数用于对字符串数组排序,该方法会在排序后返回一个新数组。
NSArray *array = [NSArray arrayWithObjects:@"abc", @"cde", @"fgh", @"bdc", nil];
NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)];
compare: 默认比较,正序排序。
caseInsensitiveCompare: 不考虑大小写比较字符串。
2.对数组对象进行排序(sortedArrayUsingDescriptors:)
可使用 NSSortDescriptor 对数组对象进行排序,key 为数组对象属性,ascending 中,YES 为正序,NO 为逆序。
//该代码即按照 date 属性进行排序
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:date ascending:YES];
如需按照多个属性进行排序,可创建多个 descriptor。
如果排序对象为 NSString,即字符串数组排序,则直接指定 sortdescriptor 的 key 为 nil ,就直接排序对象,而非对象的某一个属性。例如:
NSArray *array = [NSArray arrayWithObjects:@"wads", @"aad", @"gh", @"yef", nil];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
NSArray *sortArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
NSArray 使用 sortedArrayUsingDescriptors 返回排序号的数组。
NSMutableArray 可直接使用 sortUsingDescriptors 对数组本身排序。
3.利用 Block 语法排序(sortedArrayUsingComparator:)
NSArray *strArray = [NSArray arrayWithObjects:@"s1", @"s6", @"s3", @"s10", @"s22", @"s17", @"s31", nil];
NSArray *sortArray = [strArray sortedArrayUsingComparator:^NSComparisonResult(id string1, id string2){
return [string1 compare:string2 options:NSNumericSearch];
}];
NSLog(@"sortArray:%@",sortArray);
4.数字数组排序
因为数组中不能存放基本数据类型,只能存放实例(对象),如需存储数字,首先要转换成 NSNumber 类型,再使用 sortedArrayUsingSelector 方法进行排序。
//创建 NSNumber 对象
NSNumber *monthNumber = [NSNumber numberWithInt:3];
NSNumber *lengthNumber = [NSNumber numberWithFloat:3.7];
//还原 NSNumber 对象
int month = [monthNumber intValue];
float length = [lengthNumber floatValue];