10.15 NSMutable可变数组的方法练习
//10.15: NSMutableArray类中常用方法练习
+ (void)nsMutableArrayTest
{
//NSMutableArray是NSArray的子类,所以NSArray的功能它全部都可以使用,并且NSMutableArray对象是可变的。即对象创建了之后,也可以删除和添加元素,也可以替换元素。
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"james", @"wade", @"bosh", nil];
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSetWithIndex:4];
[indexSet addIndex:0];
[indexSet addIndex:2];
[indexSet addIndex:0];
NSLog(@"set: %@", indexSet); //将打印0,2,4;表示set集合是有序的,并且元素是唯一的。set集合会自动移除相等的元素只留下一个。用isEqual判别两个元素是否相等;
//一、添加、删除、替换元素方法
NSLog(@"---add、delete、replace---");
//0.添加一个对象
[mutableArray addObject:@"allen"];
//1.在指定索引处插入对象, 会导致元素后移。
[mutableArray insertObject:@"Howard" atIndex:3];
//2.在指定的索引集合中按大小排列的索引处插入另一个数组中按前后顺序排列的元素。
NSArray *arr = @[@"0", @"2", @"4"];
[mutableArray insertObjects:arr atIndexes:indexSet];
//3.移除最后一个元素
[mutableArray removeLastObject];
//4.移除指定索引处的元素
[mutableArray removeObjectAtIndex:3];
//5.移除和指定对象匹配的所有元素, 若没有与该对象匹配的元素,将不做任何操作;该方法给每个元素发送isEqual:消息,并利用indexOfObject:获得匹配的元素的索引,再利用removeObjectAtIndex:方法将该元素移除。
[mutableArray removeObject:@"bosh1"];
//6.移除数组中一定范围内的和指定对象匹配的所有元素。
//removeObject: inRange:
//7. 移除和指定对象匹配的所有元素,不过匹配方式更严格,要求元素和指定对象的地址要相等。
[mutableArray removeObjectIdenticalTo:@"bosh2"];
//8. 移除一定范围内和指定对象地址相等的所有元素。
//removeObjectIdenticalTo: inRange:
//9.从数组中移除和另一个数组中相等的元素,该方法需要另一个数组中的所有元素都能响应isEqual: 和 hash方法。该方法只会移除本数组中和另一个数组中相等的元素,对于不包含的元素,没有作用。
NSArray *array = @[@"James", @"Wade", @"Bosh", @"Howard", @"Irving"];
[mutableArray removeObjectsInArray:array];
//10. 移除一定范围内的所有元素, 该方法的实现用到了removeObjectAtIndex;
[mutableArray removeObjectsInRange:NSMakeRange(1, 2)];
//11.移除所有元素
[mutableArray removeAllObjects];
//12.移除指定索引集合中包含的所有索引处的元素。
//- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
//13.将另外一个数组中的所有元素添加到本数组末尾。
[mutableArray addObjectsFromArray:array];
//14.替换指定索引处的元素
[mutableArray replaceObjectAtIndex:3 withObject:@"allen"];
//15.用另一个数组中指定范围otherRange内的元素替换本数组中指定范围range内的元素。如果otherRange > range,则将otherRange多出的元素插入到本数组中,否则,移除range范围内多出的对象。如果不指定otherRange参数,则相当于otherRange为0~[otherArray count]-1;
[mutableArray replaceObjectsInRange:NSMakeRange(1, 2) withObjectsFromArray:array range:NSMakeRange(1, 3)];
//16.用另一个数组中的元素按前后顺序替换本数组中指定索引集合中的按大小顺序排列的各个索引处的元素。如果这另一个数组的元素个数小于索引集合中的索引数,将报错。
[mutableArray replaceObjectsAtIndexes:indexSet withObjects:arr];
//17.将本数组替换成另一个数组相等。
[mutableArray setArray:array];
//18. 将指定索引处的元素替换成指定对象,如果指定索引值等于数组的元素个数,将指定对象添加到数组的末尾,并使数组元素个数加一。但如果索引值大于元素个数,报错。
[mutableArray setObject:@"haha" atIndexedSubscript:5];
//19. 交换数组中两个元素的位置。
[mutableArray exchangeObjectAtIndex:0 withObjectAtIndex:5];
NSLog(@"%@", mutableArray);
//二、可变数组创建,初始化类别(NSMutableArrayCreation)
//1.给可变数组对象分配指定的空间进行初始化,这个指定的空间大小并不是可变数组对象的最终大小,只是该方法执行完后会分配这个大小的空间。以后可变数组的大小可以增长。
NSMutableArray *mutableArrayInit = [NSMutableArray arrayWithCapacity:10];
//2.所有NSArray的创建和初始化都可以用。如arrayWithObjects,initWithObjects。arrayWithArray,initWithArray....
[mutableArrayInit addObjectsFromArray:array];
//三、给可变数组对象排序
NSLog(@"----sort----");
//1.利用block对象比较器给可变数组排序,该方法将直接影响本可变数组对象。而NSArray的sortedArrayUsingComparator: 及其一类的方法都会返回一个排好序的新数组,方法不影响原数组对象。因为NSArray对象是不可变的。而NSMutableArray的这类排序方法的返回值都是void,直接影响原数组对象。还可以指定排序的选项,NSSortConcurrent选项表示并发,NSSortStable表示排序是稳定的。
NSLog(@"sort before: \n%@", mutableArray);
[mutableArray sortWithOptions:NSSortStable usingComparator:^(NSString *str1, NSString *str2){
return [str1 compare:str2];
}];
//2.利用C语言中的函数指针指向的函数作为比较器给可变数组对象排序。
//- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;
//3.利用选择器参数指向的方法作为比较器给数组排序。
//- (void)sortUsingSelector:(SEL)comparator;
NSLog(@"sort after: \n%@", mutableArray);
}

浙公网安备 33010602011771号