NSArray的功能与用法
🎇array:创建一个不包含任何元素的空NSArray
🎇arrayWithContentsOfFile:/initWithContentsOfFile:读取文件内容来创建NSArray
🎇arrayWithObject:/initWithObject:创建只包含指定元素的NSArray
🎇arrayWithObjects:/initWithObjects:创建包含指定的N个元素的NSArray
一旦得到数组对象,接下来就可以调用它的方法来操作NSArray集合。NSArray集合最大的特点是集合元素有索引,因此,读者查阅NSArray类的参考手册时会注意到它的绝大部分方法都与集合元素的索引有关。
NSArray集合的大致方法包含如下几类:
🎇查询集合元素在NSArray中的索引
🎇根据索引值取出NSArray集合中的元素
🎇对集合元素整体调用方法
🎇对NSArray集合进行排序
🎇取出NSArray集合中的部分集合组成新集合
所有NSArray的实现类都可以调用这些方法来操作集合元素。
我们来看看下面的程序:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray * array = [NSArray arrayWithObjects: @"a",@"b",@"c",@"d",@"e", nil];
NSLog(@"第一个元素:%@", [array objectAtIndex: 0]);
NSLog(@"索引为1的元素:%@", [array objectAtIndex: 1]);
NSLog(@"最后一个元素:%@", [array lastObject]);
NSArray * arr1 = [array objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange: NSMakeRange(2, 3)]];//获取从索引为2的元素开始,以及后面3个元素组成的新集合
NSLog(@"%@", arr1);
NSLog(@"d的位置为:%ld", [array indexOfObject:@"d"]);//获取元素在集合中的位置
NSLog(@"在2~5范围a的位置为:%ld", [array indexOfObject:@"a" inRange: NSMakeRange(2, 3)]);//获取元素在集合指定范围中的位置
//向数组的最后追加一个元素
array = [array arrayByAddingObject:@"f"];
//向array数组的最后追加另一个数组的所有元素
//原NSArray本身并未改变,只是将返回新的NSArray赋给array
array = [array arrayByAddingObjectsFromArray: [NSArray arrayWithObjects:@"g", @"h", nil]];
NSInteger i;
for (i = 0; i < array.count; i++) {
NSLog(@"%@", [array objectAtIndex: i]);
//NSLog(@"%@", array[i]);
}
//获取5~8的元素
NSArray * arr2 = [array subarrayWithRange: NSMakeRange(5, 3)];
//将NSArray集合元素写入文件
[arr2 writeToFile: @"myFile.txt" atomically: YES];
}
return 0;
}
输出结果:
对NSArray进行排序
🎇sortedArrayUsingFunction:context::使用排序函数对集合元素进行排序,函数必须返回NSOrderedDescending、NSOrderedAscending、NSorderedSame这些枚举值,用于代表集合元素的大小。该方法返回一个排序好的新NSArray对象。
🎇sortedArrayUsingSelector::使用集合元素自身的方法对集合元素进行排序,函数必须返回NSOrderedDescending、NSOrderedAscending、NSorderedSame这些枚举值,用于代表集合元素的大小。该方法返回一个排序好的新NSArray对象。
🎇sortedArrayUsingComparator::使用代码块对集合元素进行排序,函数必须返回NSOrderedDescending、NSOrderedAscending、NSorderedSame这些枚举值,用于代表集合元素的大小。该方法返回一个排序好的新NSArray对象。
下面的代码里是对三种方法的应用
#import <Foundation/Foundation.h>
//定义比较函数,根据两个对象的intValue进行比较
NSComparisonResult intSort (id num1, id num2, void* context) {
int v1 = [num1 intValue];
int v2 = [num2 intValue];
if(v1 < v2) {
return NSOrderedAscending;
} else if (v1 > v2) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//初始化一个元素为NSString的NSArray对象
NSArray* array1 = @[@"bbb",@"aaa",@"ddddd",@"c",@"ee",@"f"];
//使用集合元素的compare: 方法进行排序
array1 = [array1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", array1);
//初始化一个元素为NSNumber的NSArray对象
NSArray* array2 = @[
[NSNumber numberWithInt:19],
[NSNumber numberWithInt:12],
[NSNumber numberWithInt:1.2],
[NSNumber numberWithInt:-6],
[NSNumber numberWithInt:10]
];
array2 = [array2 sortedArrayUsingFunction:intSort context:nil];
NSLog(@"%@", array2);
//使用代码块对集合元素进行排序
NSArray* array3 = [array2 sortedArrayUsingComparator:^(id obj1, id obj2){
//该代码块根据集合元素的intValue进行比较
if([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending;
} else if ([obj1 intValue] < [obj2 intValue]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}];
NSLog(@"%@", array3);
}
return 0;
}
array1运用了第二种方法对数组进行排序,array2运用了第一种方法进行排序,array3运用了第三种方法进行排序。
运行结果:
使用枚举器遍历NSArray集合元素
对于NSArray对象,除了根据集合元素的索引来遍历元素,还可以调用NSArray对象的如下两个方法来返回枚举器。
🎇objectEnumerator :返回NSArray集合的顺序枚举器。
🎇reverseObjectEnumerator :返回NSArray集合的逆序枚举器。
上面两个方法都返回一个NSEnumerator枚举器,该枚举器只包含如下两个方法:
🎇allObjects:获取被枚举集合中的所有元素。
🎇nextObject:获取被枚举集合中的下一个元素。
一般来说,借助nextObject方法即可对集合元素进行枚举:程序可以采用循环不断获取nextObject方法的返回值,直到该方法的返回值为nil结束循环。
以下代码是对上述方法的使用:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray* array = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",@"ddd", nil];
//获取NSArray的顺序枚举器
NSEnumerator* en = [array objectEnumerator];
id object;
while(object = [en nextObject]) {
NSLog(@"%@", object);
}
NSLog(@"下面逆序遍历");
//获取NSArray的逆序枚举器
en = [array reverseObjectEnumerator];
while (object = [en nextObject]) {
NSLog(@"%@", object);
}
en = [array objectEnumerator];
object = [en allObjects];
NSLog(@"%@", object);
}
return 0;
}
运行结果:
快速枚举
OC还提供了一种快速枚举方法来遍历集合(包括NSArray、NSSet、NSDictionary等集合)。
语法格式如下:
for(type variableName in collection) {
//variableName自动迭代访问每个元素...
}
如果使用快速枚举来遍历NSDictionary对象,那么快速枚举中循环计数器将依次代表NSDictionary的每个key的值。
示例程序:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray* array = [NSArray arrayWithContentsOfFile:@"/Users/zhangbotian/Desktop/iOS/实验程序文本文件/myFile.txt"];
for (id object in array) {
NSLog(@"%@" , object);
}
}
return 0;
}
使用快速枚举遍历数组元素无须获得数组长度,也无须根据索引来访问数组元素。快速枚举的本质是一个for-each循环,它自动循环迭代数组的每个元素,当每个元素都被迭代一次后,for-each循环自动结束。
可变数组(NSMutableArray)
NSArray代表元素不可变集合,一旦创建成功,程序就不能向集合中添加新的元素,不能删除集合中已有的元素,也不能替换集合元素。
🙄:NSArray只是保存对象的指针,它只保证这些地址不会改变,但指针指向的变量是可变的。
NSArray有一个子类:NSMutableArray,因此它可以作为NSArray使用,同时,它也代表一个集合元素可变的集合。
NSMutableArray主要新增了如下方法:
🎇添加集合元素:add开头
🎇删除集合元素:remove开头
🎇替换集合元素:replace开头
🎇对集合本身排序:sort开头
🙄:NSMutableArray同样提供sortedArrayUsingFunction:context:、sortedArrayUsingSelector:、sortedArrayUsingComparator:三个排序方法,区别很容易理解:NSArray返回一个新的、排序好的NSArray对象,而NSMutableArray的排序方法是对集合本身排序。
NSSet
集合的初始化:
NSSet *set001 = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", nil];
NSSet *set002 = [NSSet setWithArray:@[@"1", @"3", @"7"]];
NSSet *set003 = @[@"1", @"2", @"3"];
NSSet和NSArray区别:
NSSet按Hash算法来储存元素,因此具有良好的存取和查找功能。NSSet不能保证元素的添加顺序,顺序可能发生变化。与NSArray相比,NSSet最大的区别是元素没有索引,因此不能根据索引来操作元素。
NSSet与NSArray相似之处:
- 都可通过count获取集合元素个数。
- 都可通过快速枚举来遍历集合元素。
- 都可以通过objectEnumerator方法获取NSEnumerator枚举器对集合元素进行遍历,由于NSSet无序,因此,提供反向迭代器没有意义。
- 都提供了makeObjectsPerformSelector: 、makeObjectsPerformSelector:withObject:方法对集合元素整体调用某个方法,以及enumerateObjectsUsingBlock、enumerateObjectsWithOptions:usingBlock:对集合整体或部分元素迭代执行代码块。
除了与NSArray相似的方法,NSSet包含了如下常用的方法:
- setByAddingObject::向集合添加一个新元素,返回添加元素后的新集合。
- setByAddingObjectsFromSet::使用NSSet添加多个元素,返回添加元素后的新集合。
- setByAddingObjectsFromArray::使用NSArray添加多个元素,返回添加元素后的新集合。
- allObjects::返回该集合中所有元素组成的NSArray
- anyObject::返回某个元素,元素是不确定的,但该方法并不保证随机返回(只要一个NSSet没有发生改变,无论调用多少次,返回的总是同一个元素)。
- containsObject::判断集合是否包含指定元素
- member::判断该集合是否包含与该参数相等的元素,若包含,则返回相等的元素,否则返回nil。
- objectsPassingTest::需要传入一个代码块对集合元素进行过滤,满足代码块条件的集合元素被保留下来并组成一个新的NSSet集合作为返回值。
- objectsWithOptions:passingTest::与前一个方法的功能基本相似,只是可以额外地传入一个NSEnumerationOptions迭代选项参数。
- isSubsetOfSet::判断当前NSSet集合是否为另一个集合的子集合。调用该方法需要传入另一集合。
- intersectsSet::判断两个集合的元素是否有相同元素。也就是计算两个集合是否有交集。
- isEqualToSet::判断两个集合的元素是否相等。