Objective-C 数组与可变数组
知识点
1.NSArray 类的重点函数使用
2.NSMutableArray 类的重点函数使用 3.字符串的分割和拼接
============================
NSArray, NSMutableArray
1.【需要理解的知识】
1.1 C语言中数组
1、 相同数据类型的集合;
int a[10];
float b[20];
char c[30];
2、 数组地址是连续;
1、OC数组和c数组的区别
1、NSArray是个类 数组是对象; 存储也是对象;
2、数组不能直接存储基本数据类型: char, int, shot, long…..
3、 数组分为两种: 可变数组, 不可变数组; NSArray不可变数组类, NSMutableArray是可变数组类;
区别:
C数组里面存储基本数据类型;
OC数组里面存储的是对象;
2.【需要记住的知识】
不可变数组的类名: NSArray
2、如何创建一个数组
2.1、
通过对象来创建:
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil];
通过一个数组了创建
NSArray *arr2 = [[NSArray alloc] initWithArray:arr1];
//通过类的方法创建
通过对象来创建:
NSArray *arr3 = [NSArray arrayWithObjects:@"字符串1", @"字符串2", @"字符串3", nil];
通过一个数组了创建
NSArray *arr4 = [NSArray arrayWithArray:arr2];
2.2、Objective-c 2.0 新特征
从Xcode4.6以后,允许用类似c数组方式创建数组,仅适用于不可变数组
@[对象1, 对象2, 对象3.....];
NSArray *arr5 = @[@"string1", @"string2", @"string3"];
2.4、创建一个空对象
NSNull *nilObject = [NSNull null];
==========================================================
3.数组的元素是什么
1)数组元素可以是任意对象
练习:1.用三种方式创建一个包含3个字符串对象的数组
===========================
NSArray常用方法
1、获取数组元素个数
NSUInteger count = [array count];
2、通过索引号获取相应的元素(2种) (重要) NSString *s = [array objectAtIndex:0];
NSString *s1 = array[1];
3、取出最后一个元素
NSLog(@"%@",[array lastObject]);
4、通过对象获取在数组中的下标
NSLog(@"%li",[array indexOfObject:@"string1"]);
5、判断数组中数组包含元素anObject
BOOL ret = [array containsObject:@"string4"];
===================================
5、如何取出数组中的一部分元素 sub****
1)subarrayWithRange消息
作用:取出数组中指定范围内range的元素
//6-1、 根据范围获取子数组(一部分数组元素);
NSRange range = NSMakeRange(1, 3);
NSArray *subArray = [array subarrayWithRange:range];
NSLog(@"%@", subArray);
2)objectsAtIndexes消息
作用:从数组中获取指定下标的元素
//6-2、根据下标来获取子数组:
// 整数集合对象;
NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc] init];
[indexSet addIndex:0];
[indexSet addIndex:2];
[indexSet addIndex:4];
NSArray *subArray2 = [array objectsAtIndexes: indexSet];
练习:
1.设计一个人类,方法有speak说话,创建一个人对象p1;
设计一个狗类,方法有bark叫,创建一条狗对象d1;
创建一个数组,存储一个字符串对象,一个人对象,一条狗对象;
通过循环判断该数组内的元素的类型,
如果是人,调用方法speak;
如果是狗,调用方法bark;
如果是字符串,直接输出;
2.创建一个数组,NSArray *arr = @[@“1”,@“2”,@“3”,@“4”,@“5”,@“6”,@“7”,@“8”,@“9”,@“10”];
取出该数组中下标能整除3的元素来组成一个新的数组,并且输出;
===========================
NSArray数组的遍历
回忆:如何在c语言中遍历一个数组的所有元素
1、通过下标遍历数组
for (NSInteger i = 0; i < [arr count]; i++) {
NSLog(@"%@", arr[i]);
}
2、NSEnumerator 枚举器
1)objectEnumerator消息
作用:正序输出所有元素
NSEnumerator *enumertor = [arr objectEnumerator];
2)reverseObjectEnumerator消息
作用:逆序输出所有元素
NSEnumerator *revertor = [arr reverseObjectEnumerator];
3、快速枚举法
1)for in 语法
for (NSString *s in arr) { // 把arr数组里面每一个对象一个一个地获取出来;
NSLog(@"%@", s);
}
练习:1.找出数组中长度最长的字符串
2.找出数组中长度最短的字符串
数组的总结:
1,数组也是一个对象 (NSArray类创建数组对象)
2,不可变数组一旦创建,数组的元素个数和元素内容和元素顺序都是不可以改变的
3,数组中的元素,可以是任意类型的对象,不单纯可以是字符串,包括数组对象, 人对象, 狗对象。。。。。
4,数组中存放的元素是对象的地址
5,数组可以用NSLog(%@)来打印,会打印出数组的每个元素
=====================================
NSMutableArray 和 NSArray (上述讲的NSArray的方法,都可以在NSMutableArray对象使用)
NSMutableArray 继承 NSArray;
1.NSMutableArray的作用 存储对象; (增删改)
2.如何创建一个NSMutableArray
1)通过arrayWithCapacity创建
是一个参考容量,数组会根据实际的元素变换长度
2)通过alloc创建
============================
NSMutableArray (增删改)
1、增加数组元素
添加元素
[arrM addObject:@"lixiaolong"];
从一个数组添加对象
[arrM addObjectsFromArray:@[@"zhangsan", @"lisi", @"laowang"]];
insert****
1)如何插入一个元素
[arrM insertObject:@"zhizhuxia" atIndex:2];
2) 插入多个元素
NSMutableIndexSet *index = [[NSMutableIndexSet alloc] init];//空整数集合对象
[index addIndex:0];
[index addIndex:2];
[index addIndex:3];
[arrM insertObjects:@[@"one", @"two", @"three"] atIndexes:index];
// 对象个数 和 整数个数要一致相等;
2、如何删除元素 remove*****
1)删除指定下标的元素
[arrM removeObjectAtIndex:1];
2) 删除最后一个元素
[arrM removeLastObject];
3)根据指定对象来删除元素
[arrM removeObject:@"lisi"];
4)在一定范围删除指定的元素
[arrM removeObject:@"zhangsan" inRange:NSMakeRange(0, 4)];
5)删除指定范围的所有元素:
[arrM removeObjectsInRange:NSMakeRange(3, 2)];
6)根据一个数组删除指定的元素
[arrM removeObjectsInArray:@[@"1",@"2",@"3", @"one"]];
7)一次性删除所有指定下标的元素
NSMutableIndexSet *index
[arrM removeObjectsAtIndexes:index];
8)删除所有元素
[arrM removeAllObjects];
总结:
增: add*****, insert*****
删: remove*****
练习:
1.创建一个可变数组,数组中包含若干不相同的字符串,要求将指定的字符串删除
2.创建一个数组,数组中包含若干不相同的字符串,要求将下标整除3 的元素全部删除
3.先定义一个Person类,包含一个成员变量:no,随机产生no报数
如果数组中的人的下标能整除报数, 则出列(remove)
arc4random(); // 产生随机数;
5、交换数组内的两个元素: exchangeObjectAtIndex: withObjectAtIndex
[arrM exchangeObjectAtIndex:0 withObjectAtIndex:2];
练习:
1.将数组内的元素逆序保存
@[@“1”, @“2”, @“3”, @“4”, @“5”]
@[@“5”,@“4”,@“3”,@“2”,@“1”];
6、替换元素
1)1.替换一个元素replaceObjectAtIndex:withObject:
[arrM replaceObjectAtIndex:0 withObject:@"three"];
2. 替换多个元素 replaceObjectsAtIndexes:withObjects:
[arrM replaceObjectsAtIndexes:index withObjects:@[@"four",@"one"]];
3. setArray:全部修改
[arrM setArray:@[@"fire"]];
总结:
增: add****, insert*****
删: remove******
改: replace****, exchange**** , set***** (全部改为....)
===========================
字符串的分割与拼接
1.如何分割字符串 "+" “hello_world+ddd”
1)componentsSeparatedByString消息
作用:将字符串按照指定的字符串进行分割
2)componentsSeparatedByCharactersInSet消息
作用:使用指定的NSCharaterSet集合来分割字符串
注意:若分割条件出现在开头或者结尾,则会出现空串@""
2.NSCharacterSet集合的使用与NSIndexSet的区别
需求:现在需要将一个字符串按照数字分割
1) NSCharacterSet作用
NSCharacterset是无序字符集合,
主要用来判断已知字符串是否包含制定字符集,而不可以用来保存字符串
2)characterSetWithCharactersInString消息
作用:根据指定字符串中的字符构建一个NSCharaterSet集合
3.字符串拼接
1)componentsJoinedByString消息
作用:每个元素间以指定的字符串进行连接
示例:时间,句子…
练习:
将字符串@ “I am a man” 和 @”You are so good";
组合成@“I You am are a so man good”
===========================
NSNumber的作用
需求:OC的数组无法放入C语言的基本数据类型
作用:把C语言的基本数据类型转换成NSNumber对象
=============================
8、NSMutableArray数组排序
1)数组排序方法
//按照ASC码大小进行排序
//提供一个排序的方法,使数组自动按照排序方法的法则进行排序
NSArray *arr1 = [arr sortedArrayUsingSelector:@selector(compare:)];
============================
作业:
1.根据字符串的长度对数组进行排序 (冒泡升序)(选择降序)
2:创建一个数组,元素是5个Dog 类的对象地址,遍历数组,是每个元素都执行bark函数
bark函数可以打印出dog 的姓名和年龄
3:创建一个数组,数组中有三个Cat 的对象,有三个Dog 的对象,用三种方式来遍历数组,如果是Cat 的对象就发送wash 的消息,打印“小猫在洗脸”,如果是Dog 的对象,就给对象发送bark 的消息,打印狗叫声
4:创建一个Dog的类,重写类的description方法,打印出一句话