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

2024-03-27 12:18

本文主要是介绍NSArray/NSMutableArray创建,获取,遍历,排序 - iOS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 数组基本

1.1 创建数组

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

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

NSArray * array = [[NSArray alloc] init];NSLog(@"%@",array);
  • 1
  • 2
  • 3

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

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

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

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

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

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
  • 2
  • 3
  • 4
  • 5

1.5 存储自定义的对象

最好都 description 方法

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

1.6 数组中存储基本数据类型

如果你要在数组中存储基本数据类型,请包装好了之后在去存 NSNumber

注意不要把nil值存储到 NSArray 中,会导致数据丢失

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

1.7 创建数组的快捷方式

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

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

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

1.9 从数组中取出数据

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

数组的index时从0开始的

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

1.10 获得数组的元素个数

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

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(@"不存在");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2 使用增强for循环的方式遍历数组

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

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.4 枚举器

NSArray * array3 = @[@"one",@"two",@"three"];NSEnumerator * enumerateor =  [array3 objectEnumerator];NSString * value;while (value = [enumerateor nextObject]) {NSLog(@"enum str %@",value);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

先给一个 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

ascending YES表示正序 NO表示倒序

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

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

NSArray * descripts = @[d2,d1];array3 = [array3 sortedArrayUsingDescriptors:descripts];NSLog(@"array 3 排序后  %@",array3);
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

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

再次测试:

NSArray * array4 = @[p1,p2,p3];
NSLog(@"array4 排序前 %@",array4);
array4 = [array4 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {Person * p1 = obj1;Person * p2 = obj2;//yearreturn [p1.year compare:p2.year];
}];
NSLog(@"array4 排序后 %@",array4);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果:

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

4 可变数组: NSMutableArray

NSMutableArray 继承至 NSArray

4.1 创建可变数组

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

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

[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
  • 5
  • 6
  • 7
  • 8

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

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

4.2 指定对象插入的位置

[array insertObject:str1 atIndex:2];
  • 1

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

[array removeObject:str1];
  • 1

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

[array removeObjectAtIndex:0];[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
  • 1
  • 2
  • 3
  • 4
  • 5

4.5 删除数组中所有的元素

[array removeAllObjects];NSLog(@"array %@",array);[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5 可变数组 NSMutableArray 遍历

5.1 for换遍历

for (int i = 0; i < array.count; i++)
{NSString * str = [array objectAtIndex:i];//在遍历数组的时候,千万不要给数组中,增加,或者删除元素// [array removeObject:str1];NSLog(@"str %@",str);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.2 增强for循环

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

5.3 枚举器

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

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

结果:

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
  • 10

遍历临时数组

for (int i = 0; i < tmp.count; i++)
{NSString * str = [tmp objectAtIndex:i];//从原数组中删除,临时数组中存储的对象[array2 removeObject:str];
}NSLog(@"array2 %@",array2);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

这篇关于NSArray/NSMutableArray创建,获取,遍历,排序 - iOS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852067

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免