数组反向遍历ios_iOS中数组遍历的方法及比较
数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点。
因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的。
本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了。
NSArray *langArray = [[NSUserDefaultsstandardUserDefaults]arrayForKey:@"AppleLanguages"];
第一种方法是最最熟悉的C语言演化过来的:
for (int i = 0; i
NSLog(@"langArray[%d]=%@", i, langArray[i]);
}
这个方法最普通,效率也一般,但它也有好处,一是方便针对下标的处理,就是说如果我要处理i==10的情况是很简便的,另一个是可以比较方便的反向遍历。
Objective-C 1.0里面的NSEnumerator也可以进行遍历,代码如下:
NSEnumerator *enumerator = [langArrayobjectEnumerator];
id object;
while ((object = [enumeratornextObject]) !=nil) {
NSLog(@"langArray=%@", object);
}
这里我们可以看到没有下标了,通过nextObject的方法来遍历。这个方法的好处是对于遍历NSDictionary和NSSet代码也比较类似,不便的是对于下标的处理会不方便,另外反向遍历需要用reverseObjectEnumerator方法。
objective-c发展到2.0时又有了快速遍历功能,代码如下:
for (id object in langArray) {
NSLog(@"langArray=%@", object);
}
这里代码简洁清晰,很长时间是我写代码的首选,号称效率也最高,不过不便之处同样明显,如果算法要求知道数组的下标,这个方法就抓瞎了。另外,反向需要通过[langArray reverseObjectEnumerator]来实现。
等到block出来后,iOS里面新增加了enumerateObjectsUsingBlock:的方法,代码如下:
[langArrayenumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {
NSLog(@"idx=%d, id=%@", idx, obj);
}];
这里我们看到block里面的参数包括object,下标以及是否停止遍历,应该说,这个能满足基本所有的遍历需求了,有下标,有运行的对象,还有是否继续遍历的标志。不过反向遍历呢?苹果提供了另外一个方法:
[langArrayenumerateObjectsWithOptions:NSEnumerationReverseusingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {
NSLog(@"idx=%d, id=%@", idx, obj);
}];
这个enumerateObjectsWithOptions:usingBlock:方法比enumerateObjectsUsingBlock:方法多传了一个参数,这个参数指定了遍历的顺序。
说到这里,如果我们选择正向遍历,那么这两种方法是一样的么?答案也是否定的。在enumerateObjectsWithOptions:usingBlock:方法里面,如果指定了NSEnumerationConcurrent顺序,那么底层通过GCD来处理并发执行事宜,具体实现可能会用到dispatch group。也就是说,这个会用多线程来并发实现,并不保证按照顺序执行,但效率肯定是杠杠的!
我们来看一下打印结果:
2014-06-1715:46:44.413 testStoryboard[2703:3503] idx=32, id=hu
2014-06-1715:46:44.413 testStoryboard[2703:1303] idx=16, id=ru
2014-06-1715:46:44.416 testStoryboard[2703:3503] idx=33, id=vi
2014-06-1715:46:44.412 testStoryboard[2703:60b] idx=0, id=zh-Hant
2014-06-1715:46:44.417 testStoryboard[2703:1303] idx=17, id=pl
2014-06-1715:46:44.417 testStoryboard[2703:60b] idx=1, id=zh-Hans
2014-06-1715:46:44.417 testStoryboard[2703:1303] idx=18, id=tr
2014-06-1715:46:44.419 testStoryboard[2703:60b] idx=2, id=en
2014-06-1715:46:44.419 testStoryboard[2703:1303] idx=19, id=uk
2014-06-1715:46:44.421 testStoryboard[2703:60b] idx=3, id=fr
2014-06-1715:46:44.421 testStoryboard[2703:1303] idx=20, id=ar
2014-06-1715:46:44.421 testStoryboard[2703:60b] idx=4, id=de
2014-06-1715:46:44.422 testStoryboard[2703:60b] idx=5, id=ja
2014-06-1715:46:44.422 testStoryboard[2703:60b] idx=6, id=nl
2014-06-1715:46:44.421 testStoryboard[2703:1303] idx=21, id=hr
2014-06-1715:46:44.423 testStoryboard[2703:60b] idx=7, id=it
2014-06-1715:46:44.423 testStoryboard[2703:1303] idx=22, id=cs
2014-06-1715:46:44.423 testStoryboard[2703:60b] idx=8, id=es
2014-06-1715:46:44.424 testStoryboard[2703:1303] idx=23, id=el
2014-06-1715:46:44.424 testStoryboard[2703:60b] idx=9, id=ko
2014-06-1715:46:44.424 testStoryboard[2703:1303] idx=24, id=he
2014-06-1715:46:44.425 testStoryboard[2703:60b] idx=10, id=pt
2014-06-1715:46:44.425 testStoryboard[2703:60b] idx=11, id=pt-PT
2014-06-1715:46:44.425 testStoryboard[2703:1303] idx=25, id=ro
2014-06-1715:46:44.426 testStoryboard[2703:60b] idx=12, id=da
2014-06-1715:46:44.426 testStoryboard[2703:1303] idx=26, id=sk
2014-06-1715:46:44.426 testStoryboard[2703:60b] idx=13, id=fi
2014-06-1715:46:44.426 testStoryboard[2703:1303] idx=27, id=th
2014-06-1715:46:44.427 testStoryboard[2703:60b] idx=14, id=nb
2014-06-1715:46:44.427 testStoryboard[2703:1303] idx=28, id=id
2014-06-1715:46:44.428 testStoryboard[2703:60b] idx=15, id=sv
2014-06-1715:46:44.428 testStoryboard[2703:1303] idx=29, id=ms
2014-06-1715:46:44.429 testStoryboard[2703:1303] idx=30, id=en-GB
2014-06-1715:46:44.429 testStoryboard[2703:1303] idx=31, id=ca
从这个结果我们可以看出,确实遍历了整个数组,但并发按照顺序从头到尾——也就是说,用到了dispatch group。这在遍历大数组而有相互独立时对于效率的提高是相当有利的,赞一个!
在iOS中,除数组外,还有NSDictionary和NSSet数据也是称为collection数据的,遍历有类似的地方,不过遍历没有数组那么频繁,方法上是差不多的。
数组反向遍历ios_iOS中数组遍历的方法及比较相关推荐
- python实现二叉树的重建1 之由前序遍历和中序遍历重建
前言 此题是关于树的面试题目的常见题型,题目的含义很清晰,这个就不用多说了 解法 关于这道题的解法有很多不同的样式,通用的解法是这样的: 假如现在我们有如下两个遍历的情况 preorder: [1, ...
- 二叉树的创建、前序遍历、中序遍历、后序遍历
二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /* 作者:成晓旭 ...
- c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...
点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序{ ...
- 2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则:(1)访问根节点( ...
- 根据二叉树先序遍历和中序遍历构建二叉树
前方有一个人在等着你,你只管勇敢的向前走 采用递归分治的思想,将一个大问题划分成子问题, 对于本题,根据二叉树先序遍历和中序遍历构建二叉树,思路: 我们可以求得根节点左子树的先序和中序序列,以及右子树 ...
- 二叉树的前序遍历、中序遍历、后序遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 为什么需要树这种数据结构 树的常用术语 二叉树的概念 二叉树遍历的说明 实现二叉树 实现二叉树的遍历 二叉树查找结点 二叉树 ...
- 二叉树的前序遍历,中序遍历,后序遍历-详解-配套例题
二叉树作为数据结构中一种简单而且重要的数据结构,他的存储结构和算法都相对比较简单,因此他也显得特别重要,因为很多问题都可以抽象为二叉树的问题. 在这里我们对于二叉树的基本概念不做详细介绍,我们这里主要 ...
- pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。
5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...
最新文章
- java自学难点_java学习重难点
- 服务器统一计算系统,思科为微软扩展统一计算系统UCS服务器
- sql where 1=1和 0=1 的作用
- 关于人脸和指纹识别共同交流方案
- php索引数组相等,php二维数组中子数组的某一键相等,其余键值求和
- 数组指定位置添加元素_数据结构--顺序表的9种基本运算,初始化,销毁,判断是否为空表,长度,求指定位置的元素值......
- 今日恐慌与贪婪指数为31 恐慌程度有所上升
- 有没有一种软件,可以输入乐谱就能自动演奏的?
- 求到达必败态的方法数 ZOJ 3067 Nim
- 建立自己的STM32项目库(库函数,Kile)
- mac os 触摸屏_为什么没有出现触摸屏Mac
- 解决Tabby终端使用zsh主题字体无法识别问题
- 语音合成(speech synthesis)方向十一:聊一聊增量式语音合成(iTTS)进化史
- php 支付宝用户信息授权,h5端支付宝第三方用户信息接口demo
- 搜索引擎优化 SEO攻略大全
- 运行官方byfn.sh跑通网络
- 计算机硬件甩,计算机硬件 篇一:手把手教你更新CPU微码-x99平台最后的挣扎
- 人人都能学会的英语1:开篇
- php简单学习成果检验
- 【海洋女神原创】知识普及:IS版本命名规则和高低关系
热门文章
- PAT甲级1093 Count PAT‘s :[C++题解]DP、状态机模型dp
- java条件配置,三、使用JAVA必备条件—环境配置
- 计算机网络系统集成策略实现摘要,计算机网络集成策略实现探析
- 如何吧本地仓库提交到github_解锁GitHub(5)之GitHub本地仓库使用
- soap php 分开类,PHP SoapClient类型映射的行为有所不同
- hbase java 端口_HBase远程Java客户端尝试通过随机端口进行身份验证
- textview 背景变形_重庆新中式床背景品牌
- C++继承中父类和子类之间的赋值兼容
- 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
- 用php画一个蓝底红色的圆_php把图片处理成圆形透明的头像