3.ios-NSarray
知识点
1.NSArray
2.NSMutableArray
3.字符串的
NSArray NSDictionary NSSet 数据集合 (collections)
============================
NSArray---NSMutableArray
1.NSArray对象的创建
2.如何创建一个数组
1)通过alloc创建 init
2)arrayWithObjects消息
作用:通过指定对象创建一个数组
3)arrayWithArray消息
作用:通过已存在的数组创建一个数组
3.数组的元素是什么
1)数组中的元素必须是一个对象!!!
4.什么是id类型的变量
1)通用对象类型
2)可以指向任何对象
5.NSArray和c数组的区别
1)NSArray只能存放对象,不能存放基本数据类型
2)c语言可以保存任意类型的数据
3)NSArray下标越界不会有警告,但是运行会直接报错
练习:1.创建一个包含3个字符串对象的数组
===========================
NSArray常用方法
1.回忆:如何访问c数组中的一个元素
2.如何知道数组的长度
1)count消息
3.如何查找数组中的某个元素
1)objectAtIndex消息
作用:通过下标获取数组中指定位置的元素
2)lastObject消息
作用:取出最后一个元素
4.如何取出数组中的一部分元素
1)subarrayWithRange消息
作用:取出数组中指定范围内的元素
1)objectsAtIndexs消息
作用:从数组中获取指定下标的元素
NSIndexSet对象,一个下标集合
NSMutableIndexSet对象,可以添加不同的下标
5.思考:如何知道NSArray中存储的对象是否为指定类型的对象
1)isKindOfClass使用
作用:返回一个布尔值,指示接收者是否给定的类的实例或从这个类继承的任何类的一个实例
练习:1.创建一个数组,通过循环判断该数组内的元素的类型
2.创建一个数组,取出该数组中下标为3的倍数的元素
===========================
NSArray数组的遍历
回忆:如何在c语言中遍历一个数组的所有元素
1.通过下标遍历数组
2.快速枚举法
1)for in 语法
3.NSEnumerator
1)objectEnumerator消息
作用:正序输出所有元素
2)reverseObjectEnumerator消息
作用:逆序输出所有元素
练习:1.找出数组中长度最长的字符串
2.找出数组中长度最短的字符串
============================
NSMutablArray
1.思考:为什么需要有NSMutableArray
2.NSMutableArray的作用
3.如何创建一个NSMutableArray
1)通过arrayWithCapacity创建
2)通过alloc创建
============================
NSMutableArray常用方法
1.如何查找数组中的某个元素
2.如何从NSMutableArray中取出一部分元素
3.如何插入一个元素
1)insertObject:atIndex消息
4.如何删除一个元素
1)removeObjectAtIndex消息
作用:删除指定下标的元素
2)removeObject消息
作用:根据指定对象来删除元素
3)removeLastObject消息
作用:删除最后一个元素
4)removeAllObject消息
作用:删除所有元素
练习:
1.创建一个数组,数组中包含若干不相同的字符串,要求将指定的字符串删除
2.创建一个数组,数组中包含若干不相同的字符串,要求将下标为3的倍数的元素全部删除
3.先定义一个Person类,包含一个属性no,随机产生no报数
如果数组中的人的编号正好为要报数的倍数,则出列
5.交换两个元素
1)exchangeObjectAtIndex:withObjectAtIndex:消息
练习:1.根据字符串的长度对数组进行排序
2.将数组内的元素逆序保存
6.替换元素
1)replaceObjectAtIndex:withObject:消息
7.NSMutableArray数组排序
1)数组排序方法
sortedArrayXXX函数
作用:通过返回值将排序结果告诉用户,不会修改数组中的元素
sortUsingXXX函数
作用:直接对数组内的元素进行排序,最后结果保存在要排序的数组中
1)使用@selector排序
SEL 是oc特有的类型
一个方法名对应一个id
只要方法名相同,那么它的id值就相同
ios会将方法名(函数名)转化为一个唯一id id就是SEL类型
系统通过识别id 去寻找对应的方法名
@selector :方法选择器
@selector(xxx) xxx就是方法名
SEL @selector(xxx) 那么就可以将方法名对应的字符串转化为id类型
2)使用block排序
什么是block:类似于c语言中的函数指针
block的好处:可以访问函数中的局部变量
!!!定义一个block语法!!!
block如何访问函数中的局部变量
__block关键字,是blocks语法特有的关键字 相当与将变量变成全局变量
3)使用c语言函数排序
练习:1.使用字符串中的compare方法对数组进行排序
============================
selector选择器使用
1.SEL数据类型
1)什么是SEL
Objective-C在编译的时候,会根据方法的名字(包括参数序列),
生成一个用来区分这个方法的唯一的一个ID,这个ID就是SEL类型的
PS:oc中的函数重载
2)作用:
从效率的角度上来说,执行的时候不是通过方法名字而是方法ID也就是一个整数来查找方法,由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率
并且增强程序的灵活性
3)使用方法
通过@selector()方法获取
通过NSSelectorFromString将一个字符串转换为一个SEL类型
2.performSelector
1)作用:执行SEL
===========================
字符串的分割与拼接
1.如何分割字符串
1)componentsSeparatedByString消息
作用:将字符串按照指定的字符串进行分割
注意与C字符串分割的区别
2)componentsSeparatedByCharactersInSet消息
作用:使用指定的NSCharaterSet集合来分割字符串
注意:若分割条件出现在开头或者结尾,则会出现空串@""
2.NSCharacterSet集合的使用
需求:现在需要将一个字符串按照数字分割
1) NSCharacterSet作用
NSCharacterset是无序字符集合,
主要用来判断已知字符串是否包含制定字符集,而不可以用来保存字符串
2)characterSetWithCharactersInString消息
作用:根据指定字符串中的字符构建一个NSCharaterSet集合
3.字符串拼接
1)componentsJoinedByString消息
作用:每个元素间以指定的字符串进行连接
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma make不可变数组
#pragma make 数组的创建
//字符串引用
NSString*string1=@"zhangsan";
NSString*string2=@"lisi";
NSString*string3=@"wangwu";
//最后的nil相当于结束的标志
NSArray*array1=[[NSArray alloc]initWithObjects:string1, string2, string3, nil];
NSLog(@"%@",array1);
//用类方法创建数组
NSArray*array2=[NSArray arrayWithObjects:@(2), @(3), nil];
NSLog(@"%@",array2);
//创建一个数组,将原数组中的数据拿出来放进去
NSArray*array3=[NSArray arrayWithArray:array1];
NSLog(@"%@",array3);
//字面量语法,创建出来的一定不可变的类型
//数组字面量语法
NSArray*array4=@[@"haha",array1, array2];
NSLog(@"%@",array4);
#pragma make 通过数组下标获取数组中得元素值
//objectAtIndex通过索引AtIndex:获取数组下标元素
NSString*obj1=[array1 objectAtIndex:0];
NSLog(@"%@",obj1);
//firstObject获取首元素
NSString*obj2=[array1 firstObject];
//lastObject获取最后一个元素值
NSString*obj3=[array1 lastObject];
//count获取数组长度
NSUInteger count=[array1 count];//返回一个无符号的数值
NSLog(@"%d",count);
//indexOfObject查找某素组元素的下标值
//返回一个对象在数组中得下标值
NSUInteger index=[array1 indexOfObject:@"zhangsan"];
if (index==NSNotFound) {
NSLog(@"没有找到");
}else{
NSLog(@"找到%d",index);
}
//containsObject判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值
//结果1he0;
bool iscontains=[array1 containsObject:@"zhangsan"];
NSLog(@"%d",iscontains);
//数组两两间插入字符串 componentsJoinedByString
//数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接
//注意数组中的元素必须都是字符串
NSString*string4=[array1 componentsJoinedByString:@","];
NSLog(@"%@",string4);
//添加数组arrayByAddingObjectsFromArray arrayByAddingObject
//在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的
NSArray*array5=[array1 arrayByAddingObjectsFromArray:array2];
NSLog(@"%@",array5);
NSArray*array6=[array1 arrayByAddingObject:@"maliu"];
NSLog(@"%@",array6);
#pragma make遍历数组
//for循环1
for (int i=0; i<array1.count; i++) {
NSString*str=[array1 objectAtIndex:i];
NSLog(@"[%d]=%@",i,str);
}
//for循环二
for (int i1=0; i1<array1.count; i1++) {
NSString*str1=array1[i1];
NSLog(@"[%d]=%@",i1,str1);
}
//使用增强for循环的方式遍历数组
for (NSString * str2 in array1)
{
NSLog(@"%@",str2);
}
//reverseObjectEnumerator反向遍历一个数组的值
for (NSString*str3 in [array1 reverseObjectEnumerator]) {
NSLog(@"%@",str3);
}
//枚举器
NSEnumerator * enumerator = [array1 objectEnumerator];
NSString * value;
while (value = [enumerator nextObject]) {
NSLog(@"%@",value);
}
#pragma make可变数组
//创建可变数组
NSString *str1 = @"zhangsan";
NSString *str2 = @"lisi";
NSString *str3 = @"wangwu";
NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil];
//下面的这种方式创建的数组是错误的
//下面的这种方式是创建不可变数组的方式,不能哟关于可变数组的创建
//NSMutableArray *array1 = @[str1,str2,str3];
//先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间
NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];
//使用类方法创建
NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
//添加元素的方法 addObject
[mArray1 addObject:str1];
[mArray1 addObject:str2];
//添加数组,把mArray1中的所有元素全部添加到mArray2中 addObjectsFromArray
[mArray2 addObjectsFromArray:mArray1];
NSLog(@"mArray2 = %@",mArray2);
//二维数组
//这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了
[mArray2 addObject:mArray1];
NSLog(@"二维数组%@",mArray2);
//insertObject
//在指定的位置上插入特定元素
[mArray2 insertObject:@"def" atIndex:0];
NSLog(@"插入%@",mArray2);
//replaceObjectAdIdex
//替换元素
[mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
NSLog(@"替换%@",mArray2);
//exchangeObjectAtIndex
//互换两个元素的位置
[mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
NSLog(@"互换%@",mArray2);
//removeObjectAdIndex
//删除指定位置的元素
[mArray2 removeObjectAtIndex:0];
NSLog(@"mArray2删除指定位置的元素 = %@",mArray2);
//删除最后一个元素
[mArray2 removeLastObject];
NSLog(@"mArray2删除最后一个元素 = %@",mArray2);
//删除指定的对象
[mArray2 removeObject:@"lisi"];
NSLog(@"mArray2删除指定的对象= %@",mArray2);
//删除几个对象
[mArray2 removeObjectsInRange:NSMakeRange(2, 1)];
NSLog(@"%@",mArray2);
//删除所有的对象/清空列表
[mArray2 removeAllObjects];
NSLog(@"mArray2清空列表 = %@",mArray2);
}
return 0;
}
作业
1.将@“one”, @“two”, @“three”, @“four”, @“five”, 五个字符由大到小,由小到大分别排序一次
2.有两个字符串 @“I am a man”: @“You are so good”将这两个字符串单词,交叠形成新的字符串“I You am are a so man good”
(附加题,不要求都做)
***3.仿照官方的NSMutableArray, 编写一个MyMutableArray的类,继承Array,实现添加元素,删除元素,交换元素和排序
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma make1
NSMutableArray*array1=[[NSMutableArray alloc]initWithObjects:@"one", @"two", @"there",@"four",@"five",nil];
//升序
NSMutableArray*array2=[array1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",array2);
//降序
[array1 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//NSLog(@"%@, %@", obj1, obj2);
return [obj2 compare:obj1];
}];
NSLog(@"%@", array1);
#pragma make2
NSString*string1=@"I am a man";
NSString*string2=@"You are so good";
NSMutableArray*newstring1=[string1 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]];
//NSLog(@"%@",newstring1);
NSMutableArray*newstring2=[string2 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]];
//NSLog(@"%@",newstring2);
id obj1=[newstring1 firstObject];
id obj11=[newstring2 firstObject];
id obj2=newstring1[newstring1.count-3];
id obj12=newstring2[newstring2.count-3];
id obj3=newstring1[newstring1.count-2];
id obj13=newstring2[newstring2.count-2];
id obj4=newstring1[newstring1.count-1];
id obj14=newstring2[newstring2.count-1];
NSLog(@"%@ %@ %@ %@ %@ %@ %@ %@",obj1,obj11,obj2,obj12,obj3,obj13,obj4,obj14);
//方法二
// 第一题
NSArray *array = @[@"one", @"two", @"three", @"four", @"five"];
NSArray *newArr = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", newArr);
NSArray *newArr2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj2 compare:obj1];
}];
NSLog(@"%@", newArr2);
// 第二题
NSString *str1 = @"I am a man";
NSString *str2 = @"You are so good";
NSMutableArray * arr = [[NSMutableArray alloc] initWithCapacity:8];
NSArray * arr1 = [str1 componentsSeparatedByString:@" "];
NSArray * arr2 = [str2 componentsSeparatedByString:@" "];
NSInteger length1 = [arr1 count];
NSInteger length2 = [arr2 count];
for (int i = 0; i < MAX(length1, length2); i++)
{
if (i < length1)
{
[arr addObject:arr1[i]];
}
if (i < length2)
{
[arr addObject:arr2[i]];
}
}
NSString *newString = [arr componentsJoinedByString:@" "];
NSLog(@"%@", newString);
// int a;
// int b;
//
// a>b?a:b;
NSLog(@"%d", MyMax(5, 6));
}
return 0;
}