NSArray/NSMutableArray创建,获取,遍历,排序 - iOS

版权声明:本文为博主原创,如需转载请注明出处。

1 数组基本

1.1 创建数组

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

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

1
2
3
NSArray * array = [[NSArray alloc] init];

NSLog(@"%@",array);

1.2 通过构造方法的方式创建一个NSArray

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

1
2
NSArray * array1 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
NSLog(@"%@",array1);

1.3 数组中可以存储不同类型的对象

1
2
3
NSNumber * number = [NSNumber numberWithInt:10];
NSArray * array2 = [[NSArray alloc] initWithObjects:@"one",@"two",number, nil];
NSLog(@"array2 %@",array2);

1.4 数组实际上存储的是对象的地址,同样也可以存储数组的地址

1
2
3
4
5
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 方法

1
2
3
4
5
6
7
8
@interface Person : NSObject

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

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

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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
1
2
3
4
5
6
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 中,会导致数据丢失

1
2
3
NSString * str = nil;
NSArray * array4 = [[NSArray alloc] initWithObjects:@"2",str,[NSNumber numberWithInt:23], nil];
NSLog(@"array4 %@",array4);

1.7 创建数组的快捷方式

1
2
NSArray * karray = @[@"a",@"b",@"c"];
NSLog(@"karray %@",karray);

1.8 快速获得一个数组中的元素

1
2
NSString * kstr = karray[0];
NSLog(@"kstr %@",kstr);

1.9 从数组中取出数据

1
NSArray * array = [[NSArray alloc] initWithObjects:@"one",@"two",@"three", nil];

数组的index时从0开始的

1
2
NSString * str = [array objectAtIndex:0];
NSLog(@"str %@",str);

1.10 获得数组的元素个数

1
2
NSUInteger arrayCount = [array count];
NSLog(@"arrayCount %d",arrayCount);

1.11 判断数组中是否存在某个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
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循环遍历数组

1
2
3
4
5
6
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循环的方式遍历数组

1
2
3
4
for (NSString * str in array)
{
NSLog(@"str = %@",str);
}

2.3 注意事项

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

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

1
2
3
4
5
6
7
8
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 枚举器

1
2
3
4
5
6
7
8
9
NSArray * array3 = @[@"one",@"two",@"three"];

NSEnumerator * enumerateor = [array3 objectEnumerator];

NSString * value;

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

3 数组排序

3.1 使用 sortedArrayUsingSelector

是最简单的排序方式

数组是按照你存入元素的顺序存储的

1
2
3
4
5
6
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方式排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 类

1
2
3
4
5
6
7
8
9
10
@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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

@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 定制化数组对象排序

1
2
3
4
5
6
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传入

ascending YES表示正序 NO表示倒序

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

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

1
2
3
4
5
NSArray * descripts = @[d2,d1];

array3 = [array3 sortedArrayUsingDescriptors:descripts];

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

结果:

1
2
3
4
5
6
7
8
9
10
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"
)

再次测试:

1
2
3
4
5
6
7
8
9
10
11
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);

结果:

1
2
3
4
5
6
7
8
9
10
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 创建可变数组

1
NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0];

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

1
2
3
4
5
6
7
8
[array addObject:@"one"];
[array addObject:@"two"];
[array addObject:@"three"];
[array addObject:@"one"];

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

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

1
2
3
4
[array addObject:str1];
[array addObject:str2];
[array addObject:str3];
[array addObject:str1];

4.2 指定对象插入的位置

1
[array insertObject:str1 atIndex:2];

4.3 删除 会通过对象,删除数组中所有的同一个地址的对象

1
[array removeObject:str1];

4.4 通过索引的方式删除对象,超出了数组的count值,那么就会导致异常 index beyond bounds

1
2
3
4
5
[array removeObjectAtIndex:0];

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

4.5 删除数组中所有的元素

1
2
3
4
5
6
7
[array removeAllObjects];

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

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

5 可变数组 NSMutableArray 遍历

5.1 for换遍历

1
2
3
4
5
6
7
8
9
10
for (int i = 0; i < array.count; i++)
{
NSString * str = [array objectAtIndex:i];

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

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

}

5.2 增强for循环

1
2
3
4
5
6
for (NSString * str in array)
{
// [array removeObject:str1];
//如果你在增强for循环中,删除元素,会直接导致异常出现
NSLog(@"str %@",str);
}

5.3 枚举器

1
2
3
4
5
6
7
NSEnumerator * enumerator = [array objectEnumerator];
NSString * value;
while (value = [enumerator nextObject]) {
//如果你在枚举器中,删除元素,会直接导致异常出现
// [array removeObject:str1];
NSLog(@"str %@",value);
}

5.4 要通过遍历的方式确定删除哪个元素怎么办

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);

结果:

1
2
3
4
5
6
7
8
9
10
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
)

遍历临时数组

1
2
3
4
5
6
7
8
9
for (int i = 0; i < tmp.count; i++)
{
NSString * str = [tmp objectAtIndex:i];

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

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

新博客文章地址:NSArray/NSMutableArray创建,获取,遍历,排序
CSDN文章地址:NSArray/NSMutableArray创建,获取,遍历,排序

文章目录
  1. 1. 1 数组基本
    1. 1.1. 1.1 创建数组
    2. 1.2. 1.2 通过构造方法的方式创建一个NSArray
    3. 1.3. 1.3 数组中可以存储不同类型的对象
    4. 1.4. 1.4 数组实际上存储的是对象的地址,同样也可以存储数组的地址
    5. 1.5. 1.5 存储自定义的对象
    6. 1.6. 1.6 数组中存储基本数据类型
    7. 1.7. 1.7 创建数组的快捷方式
    8. 1.8. 1.8 快速获得一个数组中的元素
    9. 1.9. 1.9 从数组中取出数据
    10. 1.10. 1.10 获得数组的元素个数
    11. 1.11. 1.11 判断数组中是否存在某个对象
  2. 2. 2 遍历数组
    1. 2.1. 2.1 使用for循环遍历数组
    2. 2.2. 2.2 使用增强for循环的方式遍历数组
    3. 2.3. 2.3 注意事项
    4. 2.4. 2.4 枚举器
  3. 3. 3 数组排序
    1. 3.1. 3.1 使用 sortedArrayUsingSelector
    2. 3.2. 3.2 使用block方式排序
    3. 3.3. 3.3 定制化数组对象排序
  4. 4. 4 可变数组: NSMutableArray
    1. 4.1. 4.1 创建可变数组
    2. 4.2. 4.2 指定对象插入的位置
    3. 4.3. 4.3 删除 会通过对象,删除数组中所有的同一个地址的对象
    4. 4.4. 4.4 通过索引的方式删除对象,超出了数组的count值,那么就会导致异常 index beyond bounds
    5. 4.5. 4.5 删除数组中所有的元素
  5. 5. 5 可变数组 NSMutableArray 遍历
    1. 5.1. 5.1 for换遍历
    2. 5.2. 5.2 增强for循环
    3. 5.3. 5.3 枚举器
    4. 5.4. 5.4 要通过遍历的方式确定删除哪个元素怎么办