版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.26 |
前言
NSArray
是数组的不变数组类,不边数组在初始化的时候元素就是不变的,不能更改任何一个元素,实际上我们用的较多的是可变数组,因为很多时候我们都需要对数组元素进行增删改查,其中增删改也只有可变数组可以做,也就是说可变数组相对来说更加灵活,这几篇我们就说一下可变数组的这个类及其相关知识,还是老规矩从整体到局部,从浅入深进行讲解,谢谢大家。感兴趣的可以看我写的上面几篇。
1. NSMutableArray简单细说(一)—— 整体了解
2. NSMutableArray简单细说(二)—— 创建和初始化
3. NSMutableArray简单细说(三)—— 数组元素的增加
4. NSMutableArray简单细说(四)—— 数组元素的删除
5. NSMutableArray简单细说(五)—— 更换数组中的对象
一、- (void)filterUsingPredicate:(NSPredicate *)predicate;
该方法的作用是:根据数组的内容评估给定的谓词,只留下匹配的对象。
下面看示例代码
- (void)demoFilterUsingPredicate
{
NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@5,@6,@7, nil];
NSArray *array2 = [NSArray arrayWithObjects:@4,@5, nil];
// 表示筛选array1在array2中的元素!YES!其中SELF指向filteredArrayUsingPredicate的调用者。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF in %@",array2];
NSArray *resultArr = [array1 filteredArrayUsingPredicate:predicate];
NSLog(@"resultArr = %@", resultArr);
}
下面看输出结果
2017-08-26 23:39:08.135 JJOC[18027:483439] resultArr = (
5
)
结论:数组元素的过滤。
二、- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
该方法的作用就是:交换数组中两个索引处的对象。
下面看示例代码
- (void)demoExchangeObjectAtIndex
{
NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
[arrM exchangeObjectAtIndex:0 withObjectAtIndex:3];
NSLog(@"arrM = %@", arrM);
}
下面看输出结果
2017-08-26 23:42:17.248 JJOC[18162:486420] arrM = (
Four,
two,
three,
one,
Five
)
结论:交换两个索引处的对象。
三、- (void)sortUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors;
该方法的作用就是:利用给定的排序描述符,对对象进行排序。
看一下参数
-
sortDescriptors
:包含用于对接收数组的内容进行排序的NSSortDescriptor
对象的数组。
看示例代码
- (void)demoSortDescription
{
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"2030",@"year", @"1",@"month",nil];
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"2010",@"year", @"2",@"month", nil];
NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"2050",@"year", @"3",@"month" ,nil];
NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:@"2014",@"year", @"4",@"month",nil];
NSDictionary *dic5 = [NSDictionary dictionaryWithObjectsAndKeys:@"2050",@"year", @"4",@"month",nil];
NSMutableArray *arrM = [NSMutableArray arrayWithObjects:dic1, dic2, dic3, dic4, dic5, nil];
NSSortDescriptor *descripor = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:YES];
NSSortDescriptor *descripor2 = [NSSortDescriptor sortDescriptorWithKey:@"month" ascending:YES];
[arrM sortUsingDescriptors:[NSArray arrayWithObjects:descripor, descripor2, nil]];
NSLog(@"resultArr = %@", arrM);
}
看输出结果
2017-08-26 23:51:46.047 JJOC[18488:495473] resultArr = (
{
month = 2;
year = 2010;
},
{
month = 4;
year = 2014;
},
{
month = 1;
year = 2030;
},
{
month = 3;
year = 2050;
},
{
month = 4;
year = 2050;
}
)
结论:利用排序描述符进行排序。
四、- (void)sortUsingComparator:(NSComparator)cmptr;
该方法的作用是:使用给定的NSComparator
块指定的比较方法对接收器进行升序排序。
下面看示例代码
- (void)demoSortUsingComparator
{
NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
[arrM sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1];
}];
NSLog(@"arrM = %@", arrM);
}
看输出结果
2017-08-27 00:01:05.027 JJOC[18709:503123] arrM = (
two,
three,
one,
Four,
Five
)
结论:比较器进行数组元素的比较。
五、- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr;
该方法的作用就是:使用指定的选项和由给定的NSComparator
块指定的比较方法按升序对接收方进行排序。
下面看一下参数:
-
opts
:指定排序选项的位掩码(是否应同时执行,是否应稳定执行)。 -
cmptr
:比较器的块代码。
下面看示例代码
- (void)demoSortWithOptions
{
NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"Four", @"Five", nil];
[arrM sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1];
}];
NSLog(@"arrM = %@", arrM);
}
看输出结果
2017-08-27 00:06:11.983 JJOC[18900:508769] arrM = (
two,
three,
one,
Four,
Five
)
结论:带有选项比较器的排序。
六、- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void *))compare context:(void *)context;
该方法的作用是:按照比较功能比较定义的升序对接收器进行排序。
看一下参数:
-
compare
:用于比较两个元素的比较函数。函数的参数是要比较的两个对象和上下文参数,上下文。 如果第一个元素小于第二个元素,则该函数应返回NSOrderedAscending
,如果第一个元素大于第二个元素,则返回NSOrderedDescending
,如果元素相等则返回NSOrderedSame
。 -
context
:传递比比较函数的上下文。
还要注意:
- 该方法允许比较基于一些外部参数,例如字符排序是区分大小写还是不区分大小写。
结论:使用函数进行排序。
七、- (void)sortUsingSelector:(SEL)comparator;
该方法的作用是:按照由给定选择器指定的比较方法确定的升序排序接收器。
这里看一下参数:
-
comparator
:一个选择器,指定比较方法来比较数组中的元素。比较器消息被发送到数组中的每个对象,并且在数组中具有另一个对象。 如果数组小于参数,则比较器方法应返回NSOrderedAscending
,如果数组大于参数,NSOrderedDescending
,如果它们相等则返回NSOrderedSame
。
下面看示例代码
- (void)demoSortedArrayUsingSelector
{
NSMutableArray *arrM = [NSMutableArray arrayWithObjects: @"six", @"two", @"three", @"four", @"five", nil];
[arrM sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"arrM = %@", arrM);
}
下面看输出结果
2017-08-27 00:32:38.649 JJOC[20166:534702] arrM = (
six,
two,
three,
four,
five
)
结论:采用指定方法直接排序。
后记
未完,待续~~~