Objective-C第六章Foundation框架的数组与可变数组
你好!我是小柒,今天我们来学习一下数组和可变数组。
数组
本节内容
1、数组
2、可变数组
一、数组
小柒什么是数组啊?
答;数组是个数据容器,可以往该容器里任意添加多个对象;数组中只能存放对象类型,不能存放基本数据类型;可以通过下标访问数组中的对象。
//NSArray
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//___________________数组初始化____________________
// 1.空数组
NSArray *array = [NSArray array];
NSLog(@"array = %@",array);
// 2.一个元素的数组
NSArray *array0 = [NSArray arrayWithObject:@"卡特琳娜"];
NSLog(@"array0 = %@",array0);
NSArray *array1 = [NSArray arrayWithObject:@"123"];
NSLog(@"array1 = %@",array1);
NSArray *array2 = [NSArray arrayWithObject:@"qwe"];
NSLog(@"array2 = %@",array2);
// 3.多个数组,元素之间用逗号隔开,最后以nil结束
NSArray *array3 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSLog(@"array3 = %@",array3);
// 4.多个数组二形态,注意最后一个元素不用加逗号
NSArray *array4 = @[
@"12",
@"13",
@"14"
];
NSLog(@"array4 = %@",array4);
//_______________________常用方法__________________
NSArray *array5 = @[
@"112",
@"131",
@"114"
];
// 数组元素个数
NSInteger count = array5.count;
// 第一个元素
[array5 firstObject];
// 最后一个元素
[array5 lastObject];
// 获取数组某个位置的元素
[array5 objectAtIndex:2];
// 获取某个元素在数组中的位置
NSInteger i = [array5 indexOfObject:@"114"];
NSLog(@"i = %ld",i);
// 判断数组中有没有这个元素
BOOL b = [array5 containsObject:@"12"];
if (b) {
NSLog(@"有");
}else{
NSLog(@"没有");
}
//——————————————————数组的遍历—————————————————————
NSArray *array6 = @[
@"盖伦",
@"卡特琳娜",
@"黑默丁格"
];
// for循环遍历
for (int i = 0; i < array6.count; i++) {
NSString *str = array6[i];
NSLog(@"str = %@",str);
}
// 快速遍历
// for(样式 参数名 in 数组对象)
// {
// 打印参数名
// }
for (id oo in array6) {
NSLog(@"oo = %@",oo);
}
// 枚举遍历
// 获取数组所有元素的枚举器
NSEnumerator *enumerator = [array6 objectEnumerator];
id object;
// 第一次遍历,nextObject指向数组的首个元素,当取值结束以后,再指向下一个元素,直到取完最后一个元素,nextObject值为0,遍历结束。
while (object = [enumerator nextObject]) {
NSLog(@"object = %@",object);
}
}
return 0;
}
打印结果:
2016-01-26 11:39:19.757 Task[2050:47186] array = (
)
2016-01-26 11:39:19.758 Task[2050:47186] array0 = (
"\U5361\U7279\U7433\U5a1c"
)
2016-01-26 11:39:19.758 Task[2050:47186] array1 = (
123
)
2016-01-26 11:39:19.758 Task[2050:47186] array2 = (
qwe
)
2016-01-26 11:39:19.758 Task[2050:47186] array3 = (
1,
2,
3
)
2016-01-26 11:39:19.759 Task[2050:47186] array4 = (
12,
13,
14
)
2016-01-26 11:39:19.759 Task[2050:47186] i = 2
2016-01-26 11:39:19.759 Task[2050:47186] 没有
2016-01-26 11:39:19.759 Task[2050:47186] str = 盖伦
2016-01-26 11:39:19.759 Task[2050:47186] str = 卡特琳娜
2016-01-26 11:39:19.759 Task[2050:47186] str = 黑默丁格
2016-01-26 11:39:19.759 Task[2050:47186] oo = 盖伦
2016-01-26 11:39:19.759 Task[2050:47186] oo = 卡特琳娜
2016-01-26 11:39:19.759 Task[2050:47186] oo = 黑默丁格
2016-01-26 11:39:19.761 Task[2050:47186] object = 盖伦
2016-01-26 11:39:19.761 Task[2050:47186] object = 卡特琳娜
2016-01-26 11:39:19.761 Task[2050:47186] object = 黑默丁格
Program ended with exit code: 0
//数组存放自定义对象
// Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property NSString *name;
@end
// main.m
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//————————————————数组存放自定义类的对象—————————————
Student *stu = [[Student alloc] init];
stu.name = @"卡特琳娜";
Student *stu1 = [[Student alloc] init];
stu1.name = @"黑默丁格";
NSArray *array = @[stu.name,
stu1.name
];
for (int i = 0; i < array.count; i++) {
NSLog(@"array = %@",array);
id stu2 = array[i];
NSLog(@"stu2 = %@",stu2);
//————判断某个对象是否是某个类,多用于处理不确定的情况————
if ([stu2 isKindOfClass:[Student class]]) {
NSLog(@"[stu2 name] = %@",[stu2 name]);
}
for (Student *st in array) {
NSLog(@"st%@",st);
}
}
}
return 0;
}
2016-01-26 11:41:42.750 Task2[2132:48749] array = (
"\U5361\U7279\U7433\U5a1c",
"\U9ed1\U9ed8\U4e01\U683c"
)
2016-01-26 11:41:42.751 Task2[2132:48749] stu2 = 卡特琳娜
2016-01-26 11:41:42.751 Task2[2132:48749] st卡特琳娜
2016-01-26 11:41:42.751 Task2[2132:48749] st黑默丁格
2016-01-26 11:41:42.751 Task2[2132:48749] array = (
"\U5361\U7279\U7433\U5a1c",
"\U9ed1\U9ed8\U4e01\U683c"
)
2016-01-26 11:41:42.751 Task2[2132:48749] stu2 = 黑默丁格
2016-01-26 11:41:42.752 Task2[2132:48749] st卡特琳娜
2016-01-26 11:41:42.752 Task2[2132:48749] st黑默丁格
Program ended with exit code: 0
//可变数组
//NSMutableArray
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建可变数组
NSMutableArray *array = [NSMutableArray array];
NSLog(@"array = %@",array);
// arrayWithCapacity初始化指定长度
NSMutableArray *array1 = [NSMutableArray arrayWithCapacity:10];
NSLog(@"array1 = %@",array1);
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"卡特琳娜",@"盖伦",@"黑默丁格", nil];
NSLog(@"array2 = %@",array2);
// 可变数组不可以使用该创建方法,因为该方法创建的数组是常量,也就是不可变数组
// NSMutableArray *array3 = @[
// @"卡特琳娜",
// @"卡特琳娜",
// ];
// 方法
//——————————————————————增————————————————————————
NSMutableArray *array3 = [NSMutableArray arrayWithCapacity:10];
// 增加单个元素
[array3 addObject:@"123"];
NSLog(@"array3 = %@",array3);
// 将一个数组的所有元素添加到原数组的尾部。
[array3 addObjectsFromArray:@[@"q",@"w",@"e",@"r"]];
NSLog(@"array3.1 = %@",array3);
// 将某个元素添加到数组指定位置,注意下标不要越界
[array3 insertObject:@"wc" atIndex:1];
NSLog(@"array3.2 = %@",array3);
//————————————————————————删——————————————————————
NSMutableArray *array4 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
NSLog(@"array4 = %@",array4);
// 删除最后一个元素
[array4 removeLastObject];
NSLog(@"array4 = %@",array4);
// 删除某个元素
[array4 removeObject:@"1"];
NSLog(@"array4 = %@",array4);
// 删除某个位置的元素
[array4 removeObjectAtIndex:0];
NSLog(@"array4 = %@",array4);
// 删除数组所有元素
[array4 removeAllObjects];
NSLog(@"array4 = %@",array4);
//————————————————————改——————————————————————————
NSMutableArray *array5 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
// 用于给定对象,替换指定位置元素
[array5 replaceObjectAtIndex:1 withObject:@"wc"];
NSLog(@"array5 = %@",array5);
// 用于交换元素位置
[array5 exchangeObjectAtIndex:1 withObjectAtIndex:2];
NSLog(@"array5.1 = %@",array5);
//——————————————————————注意事项———————————————————
// 1、在给可变数组添加元素是,要保证该数组已被初始化。
// 2、在遍历可变数组时,不能对其进行增删改,但是不可变数组可以对数组元素进行筛选
// 3、可变数组是不能直接进行遍历的,必须先用一个不可变数组去接收可变数组
NSMutableArray *array6 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
NSArray *array7 = [NSArray arrayWithArray:array6];
for (NSString *s in array7) {
[array6 removeObject:@"1"];//没有任何效果
NSLog(@"s = %@",s);
}
}
return 0;
}
打印结果
2016-01-26 11:44:18.849 Task3[2215:50205] array = (
)
2016-01-26 11:44:18.850 Task3[2215:50205] array1 = (
)
2016-01-26 11:44:18.850 Task3[2215:50205] array2 = (
"\U5361\U7279\U7433\U5a1c",
"\U76d6\U4f26",
"\U9ed1\U9ed8\U4e01\U683c"
)
2016-01-26 11:44:18.850 Task3[2215:50205] array3 = (
123
)
2016-01-26 11:44:18.850 Task3[2215:50205] array3.1 = (
123,
q,
w,
e,
r
)
2016-01-26 11:44:18.850 Task3[2215:50205] array3.2 = (
123,
wc,
q,
w,
e,
r
)
2016-01-26 11:44:18.851 Task3[2215:50205] array4 = (
1,
2,
3,
4,
5
)
2016-01-26 11:44:18.851 Task3[2215:50205] array4 = (
1,
2,
3,
4
)
2016-01-26 11:44:18.851 Task3[2215:50205] array4 = (
2,
3,
4
)
2016-01-26 11:44:18.851 Task3[2215:50205] array4 = (
3,
4
)
2016-01-26 11:44:18.851 Task3[2215:50205] array4 = (
)
2016-01-26 11:44:18.851 Task3[2215:50205] array5 = (
1,
wc,
3,
4,
5
)
2016-01-26 11:44:18.851 Task3[2215:50205] array5.1 = (
1,
3,
wc,
4,
5
)
2016-01-26 11:44:18.851 Task3[2215:50205] s = 1
2016-01-26 11:44:18.851 Task3[2215:50205] s = 2
2016-01-26 11:44:18.852 Task3[2215:50205] s = 3
2016-01-26 11:44:18.852 Task3[2215:50205] s = 4
2016-01-26 11:44:18.852 Task3[2215:50205] s = 5
Program ended with exit code: 0
//数组排序
// Student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property NSString *name;
@property int age;
-(NSComparisonResult)compareWithName:(Student *)st;
-(NSComparisonResult)compareWithAge:(Student *)st1;
@end
// Student.m
#import "Student.h"
@implementation Student
-(NSString *)description{
return [NSString stringWithFormat:@"%@ , %d",_name,_age];
}
//比较方法的实现
-(NSComparisonResult)compareWithName:(Student *)stu{
//对象的比较结果就相当于属性比较结果,self,最开始代表第0个元素,后面再比较时,代表交换后的满足条件的对象
/*
0 self a[0];
1 self a[1]
2 self a[2]
*/
//当self放在第一个参数是,代表升序,放在第二个参数时,代表降序 只有result为1的时候才进行交换
NSComparisonResult result = [stu.name compare: self.name];
return result;
}
-(NSComparisonResult)compareWithAge:(Student *)stu1
{
NSComparisonResult result = 0;
if (self.age > stu1.age) {
result = 1;
NSLog(@"生序");
}else{
result = -1;
NSLog(@"降序");
}
return result;
}
@end
//数组排序
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//————————————————————数组排序—————————————————————
// 1、要用排序的原数组调用实例方法,第二个参数,方法选择,如果数组的元素都是字符串,那么直接用compare:就行,如果是自定义对象,就需要改写compare
NSArray *array = @[@"235",
@"523",
@"325",
@"352"
];
NSArray *array1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"array1 = %@",array1);
// 此方法只能生序
//__________________自定义对象排序__________________
Student *stu = [[Student alloc] init];
stu.name = @"QQQ";
stu.age = 12;
Student *stu1 = [[Student alloc] init];
stu1.name = @"WWW";
stu1.age = 15;
Student *stu2 = [[Student alloc] init];
stu2.name = @"EEE";
stu2.age = 14;
NSArray *array2 = @[stu,
stu1,
stu2
];
NSArray *array3 = [array2 sortedArrayUsingSelector:@selector(compareWithName:)];
NSLog(@"array3 = %@",array3);
NSArray *array4 = [array2 sortedArrayUsingSelector:@selector(compareWithAge:)];
NSLog(@"array4 = %@",array4);
}
return 0;
}
打印结果:
2016-01-26 11:46:01.516 Task4[2275:51311] array1 = (
235,
325,
352,
523
)
2016-01-26 11:46:01.517 Task4[2275:51311] array3 = (
"WWW , 15",
"QQQ , 12",
"EEE , 14"
)
2016-01-26 11:46:01.517 Task4[2275:51311] 降序
2016-01-26 11:46:01.518 Task4[2275:51311] 生序
2016-01-26 11:46:01.518 Task4[2275:51311] 降序
2016-01-26 11:46:01.518 Task4[2275:51311] array4 = (
"QQQ , 12",
"EEE , 14",
"WWW , 15"
)
Program ended with exit code: 0