数组遍历是编码中很常见的一种需求,我们来扒一拔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中数组遍历的方法及比较相关推荐

  1. python实现二叉树的重建1 之由前序遍历和中序遍历重建

    前言 此题是关于树的面试题目的常见题型,题目的含义很清晰,这个就不用多说了 解法 关于这道题的解法有很多不同的样式,通用的解法是这样的: 假如现在我们有如下两个遍历的情况 preorder: [1, ...

  2. 二叉树的创建、前序遍历、中序遍历、后序遍历

    二叉树的创建.前序遍历.中序遍历.后序遍历 // BTree.cpp : Defines the entry point for the console application. /*  作者:成晓旭 ...

  3. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  4. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序{ ...

  5. 2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

    树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则:(1)访问根节点( ...

  6. 根据二叉树先序遍历和中序遍历构建二叉树

    前方有一个人在等着你,你只管勇敢的向前走 采用递归分治的思想,将一个大问题划分成子问题, 对于本题,根据二叉树先序遍历和中序遍历构建二叉树,思路: 我们可以求得根节点左子树的先序和中序序列,以及右子树 ...

  7. 二叉树的前序遍历、中序遍历、后序遍历

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 为什么需要树这种数据结构 树的常用术语 二叉树的概念 二叉树遍历的说明 实现二叉树 实现二叉树的遍历 二叉树查找结点 二叉树 ...

  8. 二叉树的前序遍历,中序遍历,后序遍历-详解-配套例题

    二叉树作为数据结构中一种简单而且重要的数据结构,他的存储结构和算法都相对比较简单,因此他也显得特别重要,因为很多问题都可以抽象为二叉树的问题. 在这里我们对于二叉树的基本概念不做详细介绍,我们这里主要 ...

  9. pta习题:给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。

    5-6 树的遍历 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一 ...

最新文章

  1. java自学难点_java学习重难点
  2. 服务器统一计算系统,思科为微软扩展统一计算系统UCS服务器
  3. sql where 1=1和 0=1 的作用
  4. 关于人脸和指纹识别共同交流方案
  5. php索引数组相等,php二维数组中子数组的某一键相等,其余键值求和
  6. 数组指定位置添加元素_数据结构--顺序表的9种基本运算,初始化,销毁,判断是否为空表,长度,求指定位置的元素值......
  7. 今日恐慌与贪婪指数为31 恐慌程度有所上升
  8. 有没有一种软件,可以输入乐谱就能自动演奏的?
  9. 求到达必败态的方法数 ZOJ 3067 Nim
  10. 建立自己的STM32项目库(库函数,Kile)
  11. mac os 触摸屏_为什么没有出现触摸屏Mac
  12. 解决Tabby终端使用zsh主题字体无法识别问题
  13. 语音合成(speech synthesis)方向十一:聊一聊增量式语音合成(iTTS)进化史
  14. php 支付宝用户信息授权,h5端支付宝第三方用户信息接口demo
  15. 搜索引擎优化 SEO攻略大全
  16. 运行官方byfn.sh跑通网络
  17. 计算机硬件甩,计算机硬件 篇一:手把手教你更新CPU微码-x99平台最后的挣扎
  18. 人人都能学会的英语1:开篇
  19. php简单学习成果检验
  20. 【海洋女神原创】知识普及:IS版本命名规则和高低关系

热门文章

  1. PAT甲级1093 Count PAT‘s :[C++题解]DP、状态机模型dp
  2. java条件配置,三、使用JAVA必备条件—环境配置
  3. 计算机网络系统集成策略实现摘要,计算机网络集成策略实现探析
  4. 如何吧本地仓库提交到github_解锁GitHub(5)之GitHub本地仓库使用
  5. soap php 分开类,PHP SoapClient类型映射的行为有所不同
  6. hbase java 端口_HBase远程Java客户端尝试通过随机端口进行身份验证
  7. textview 背景变形_重庆新中式床背景品牌
  8. C++继承中父类和子类之间的赋值兼容
  9. 单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
  10. 用php画一个蓝底红色的圆_php把图片处理成圆形透明的头像