ios 数组

1 数组基本

1.1 创建数组

NSArray 是不可变数组,一旦创建完成就不能够对数组进行,添加,删除等操作

下面这种方式相当于什么都没做

NSArray * array = [[NSArray alloc] init];
NSLog(@"%@",array);
1.2 通过构造方法的方式创建一个NSArray

在创建一个NSArray的时候,集合的最后一个元素一定是nil

NSArray * array1 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
NSLog(@"%@",array1);
1.3 数组中可以存储不同类型的对象
NSNumber * number = [NSNumber numberWithInt:10];
NSArray * array2 = [[NSArray alloc] initWithObjects:@"one",@"two",number, nil];
NSLog(@"array2  %@",array2);
1.4 数组实际上存储的是对象的地址,同样也可以存储数组的地址
NSArray * a1 = [[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil];
NSArray * a2 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSArray * a3 = [[NSArray alloc] initWithObjects:a1,a2, nil];

NSLog(@"a3 %@",a3);
1.5 存储自定义的对象

最好都 description 方法

@interface Person : NSObject

@property (nonatomic, strong) NSString * name;
@property (nonatomic, assign) int age;

- (id)initWithName:(NSString *)name andAge:(int)age;

@end
@implementation Person

- (id)initWithName:(NSString *)name andAge:(int)age
{
 if (self = [super init])
 {
 _name = name;
 _age = age;
 }
 return self;
}

- (NSString *)description
{
 return [NSString stringWithFormat:@"age = %d name = %@",_age,_name];
}

@end
Person * p1 = [[Person alloc] initWithName:@"xiaozhe" andAge:20];
Person * p2 = [[Person alloc] initWithName:@"hell" andAge:18];
Person * p3 = [[Person alloc] initWithName:@"marray" andAge:38];

NSArray * array3 = [[NSArray alloc] initWithObjects:p1,p2,p3, nil];
NSLog(@"array3  %@",array3);
1.6 数组中存储基本数据类型

如果你要在数组中存储基本数据类型,请包装好了之后在去存 NSNumber
注意不要把nil值存储到 NSArray 中,会导致数据丢失

NSString * str = nil;
NSArray * array4 = [[NSArray alloc] initWithObjects:@"2",str,[NSNumber numberWithInt:23], nil];
NSLog(@"array4 %@",array4);
1.7 创建数组的快捷方式
NSArray * karray = @[@"a",@"b",@"c"];
NSLog(@"karray %@",karray);
1.8 快速获得一个数组中的元素
NSString * kstr = karray[0];
NSLog(@"kstr %@",kstr);
1.9 从数组中取出数据
NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil];

数组的index时从0开始的

NSString * str = [array objectAtIndex:0];
NSLog(@"str %@",str);
1.10 获得数组的元素个数
NSUInteger arrayCount = [array count];
NSLog(@"arrayCount %d",arrayCount);
1.11 判断数组中是否存在某个对象
Person * p1 = [[Person alloc] initWithName:@"yofer" andAge:20];
Person * p2 = [[Person alloc] initWithName:@"luke" andAge:30];

NSArray * array = @[p1,p2];

BOOL isContain = [array containsObject:p1];
if (isContain)
{
 NSLog(@"存在");
}else
{
 NSLog(@"不存在");
}

2 遍历数组

2.1 使用for循环遍历数组
NSArray * array = @[@"one",@"two",@"three"];
for (int i = 0; i < array.count; i++)
{
 NSString * str = array[i];
 NSLog(@"array[%d] = %@",i,str);
}
2.2 使用增强for循环的方式遍历数组
for (NSString * str in array)
{
 NSLog(@"str = %@",str);
}
2.3 注意事项

如果你的数组中存储了多种不同类型的数据,那么最好不要调用某个对象特有的方法,会导致程序崩溃

在实际的开发中,一个数组往往只负责存储一种数据类型

Person * p1 = [[Person alloc] init];
NSArray * array2 = @[@"one",[NSNumber numberWithInt:10],p1];

for (NSString * str in array2)
{
//    NSLog(@"array2 str %@",str);
//    NSLog(@"str %ld",str.length);
}
2.4 枚举器
NSArray * array3 = @[@"one",@"two",@"three"];

NSEnumerator * enumerateor =  [array3 objectEnumerator];

NSString * value;

while (value = [enumerateor nextObject]) {
 NSLog(@"enum str %@",value);
}

3 数组排序

3.1 使用 sortedArrayUsingSelector

是最简单的排序方式
数组是按照你存入元素的顺序存储的

NSArray * array = @[@"b",@"d",@"a",@"z"];
NSLog(@"排序前 array %@",array);

array = [array sortedArrayUsingSelector:@selector(compare:)];
// NSArray * array1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后 array %@",array);
3.2 使用block方式排序
NSArray * array2 = @[@"z",@"4",@"b",@"3",@"x"];

NSLog(@"array2 排序前 %@",array2);
array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

 /*
 NSComparisonResult retuslt = [obj1 compare:obj2];

 return retuslt;
 */
 //obj1 compare obj2 就是正序排序
 //  return [obj1 compare:obj2];
 //obj2 compare obj1 就是倒序排序
 return [obj2 compare:obj1];

}];
NSLog(@"array2 排序后 %@",array2);

先给一个 Person 类

@interface Person : NSObject

@property (nonatomic,assign) int age;
@property (nonatomic,strong) NSString * name;
@property (nonatomic,strong) NSString * year;

- (id)initWithName:(NSString *)name  andAge:(int)age andYear:(NSString *)year;
//+ (id)personWithName:(NSString *)name  andAge:(int)age andYear:(NSString *)year;

@end
@implementation Person

- (id)initWithName:(NSString *)name  andAge:(int)age andYear:(NSString *)year
{
 if (self = [super init])
 {
 _name = name;
 _age = age;
 _year = year;

 }
 return self;
}

- (NSString *)description
{
 return [NSString stringWithFormat:@"name %@ age %d year %@",_name,_age,_year];
}

@end
3.3 定制化数组对象排序
Person * p1 = [[Person alloc] initWithName:@"xiaozhe" andAge:20 andYear:@"1990"];
Person * p2 = [[Person alloc] initWithName:@"alex" andAge:18 andYear:@"2990"];
Person * p3 = [[Person alloc] initWithName:@"merry" andAge:25 andYear:@"1890"];

NSArray * array3 = @[p1,p2,p3];
NSLog(@"array3 排序前 %@",array3);

如果你向给你自己定义的对象排序,必须根据某一个属性来排序,

sortDescriptorWithKey 参数要的就是你对象中,要依据哪个属性来排序,你就把哪个属性的名字当成key传入
ascendingYES表示正序 NO表示倒序

NSSortDescriptor * d1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
NSSortDescriptor * d2 = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:NO];

如果你要使用多个属性进行排序,默认在前面的NSSortDescriptor优先级比较高

NSArray * descripts = @[d2,d1];

array3 = [array3 sortedArrayUsingDescriptors:descripts];

NSLog(@"array 3 排序后  %@",array3);

结果:

2016-08-14 14:13:57.238 05-数组排序[2105:516991] array3 排序前 (
 "name xiaozhe age 20 year 1990",
 "name alex age 18 year 2990",
 "name merry age 25 year 1890"
)
2016-08-14 14:13:57.238 05-数组排序[2105:516991] array 3 排序后  (
 "name alex age 18 year 2990",
 "name xiaozhe age 20 year 1990",
 "name merry age 25 year 1890"
)

再次测试:

NSArray * array4 = @[p1,p2,p3];
NSLog(@"array4 排序前 %@",array4);
array4 = [array4 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

 Person * p1 = obj1;
 Person * p2 = obj2;

 //year
 return [p1.year compare:p2.year];
}];
NSLog(@"array4 排序后 %@",array4);

结果:

2016-08-14 14:13:57.238 05-数组排序[2105:516991] array4 排序前 (
 "name xiaozhe age 20 year 1990",
 "name alex age 18 year 2990",
 "name merry age 25 year 1890"
)
2016-08-14 14:13:57.238 05-数组排序[2105:516991] array4 排序后 (
 "name merry age 25 year 1890",
 "name xiaozhe age 20 year 1990",
 "name alex age 18 year 2990"
)

4 可变数组: NSMutableArray

NSMutableArray 继承至 NSArray

4.1 创建可变数组
NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0];

使用addObject 动态给数组中增加元素

[array addObject:@"one"];
[array addObject:@"two"];
[array addObject:@"three"];
[array addObject:@"one"];

NSString * str1 = @"one";
NSString * str2 = @"two";
NSString * str3 = @"three";

数组中可以存储,同一个对象多次

[array addObject:str1];
[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
4.2 指定对象插入的位置
[array insertObject:str1 atIndex:2];
4.3 删除 会通过对象,删除数组中所有的同一个地址的对象
[array removeObject:str1];
4.4 通过索引的方式删除对象,超出了数组的count值,那么就会导致异常 index beyond bounds
[array removeObjectAtIndex:0];

[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
4.5 删除数组中所有的元素
[array removeAllObjects];

NSLog(@"array %@",array);

[array addObject:str2];
[array addObject:str3];
[array addObject:str1];

5 可变数组 NSMutableArray 遍历

5.1 for换遍历
for (int i = 0; i < array.count; i++)
{
 NSString * str = [array objectAtIndex:i];

 //在遍历数组的时候,千万不要给数组中,增加,或者删除元素
 // [array removeObject:str1];

 NSLog(@"str %@",str);

}
5.2 增强for循环
for (NSString * str in array)
{
//    [array removeObject:str1];
 //如果你在增强for循环中,删除元素,会直接导致异常出现
 NSLog(@"str %@",str);
}
5.3 枚举器
NSEnumerator * enumerator = [array objectEnumerator];
NSString * value;
while (value = [enumerator nextObject]) {
 //如果你在枚举器中,删除元素,会直接导致异常出现
//    [array removeObject:str1];
 NSLog(@"str %@",value);
}
5.4 要通过遍历的方式确定删除哪个元素怎么办
NSMutableArray * array2 = [[NSMutableArray alloc] init];
[array2 addObject:@"1"];
[array2 addObject:@"2"];
[array2 addObject:@"3"];
[array2 addObject:@"4"];
[array2 addObject:@"5"];

NSMutableArray * tmp = [[NSMutableArray alloc] init];

for (NSString * str in array2)
{
 if ([str isEqualToString:@"3"])
 {
 [tmp addObject:str];
 }
}

NSLog(@"array2 %@",array2);
NSLog(@"tmp %@",tmp);

结果:

2016-08-14 14:35:20.437 06-可变数组[2252:538261] array2 (
 1,
 2,
 3,
 4,
 5
)
2016-08-14 14:35:20.437 06-可变数组[2252:538261] tmp (
 3
)

遍历临时数组

for (int i = 0; i < tmp.count; i++)
{
 NSString * str = [tmp objectAtIndex:i];

 //从原数组中删除,临时数组中存储的对象
 [array2 removeObject:str];
}

NSLog(@"array2 %@",array2);</pre>

转载文章
iOS NSMutableArray 底层实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容