Objective-C 数组

数组(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];