NSArray其中的方法--遍历,

1. ForLoopFor - inenumerateObjects这个三个方法的区别:

遍历一个数组用For-in最快.

通过Value查询index的时候, 面对大量的数组推荐使用 enumerateObjectsWithOptions的并行方法.

遍历字典类型的时候, enumerateKeysAndObjectsUsingBlock效率最高

  1.1遍历数组

    NSMutableArray *test = [NSMutableArray array];
    for (int i = 0; i < 1000000; i ++) {
        [test addObject:@(i)];
    }

    //ForLoop方法
    __block int sum = 0;
    double date_s = CFAbsoluteTimeGetCurrent();
    for (int i = 0; i < test.count; i ++) {
        sum += [test[i] integerValue];
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d ForLoop Time: %f ms",sum,date_current * 1000);

    //For - in方法
    sum = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    for (NSNumber *num in test) {
        sum += [num integerValue];
    }
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d For-in Time: %f ms",sum,date_current * 1000);

    //enumerateObjectsUsingBlock方法
    sum = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        sum += [obj integerValue];
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"Sum : %d enumrateBlock Time: %f ms",sum,date_current * 1000);

打印如下:

      

总结:遍历一个数组用For-in最快.

  1.2-通过Value查找Index看谁快

实验:For - inenumerateObjectsUsingBlockenumerateObjectsWithOptions 这个三个方法: (ForLoop已经不再继续讨论了) 

    NSMutableArray *test = [NSMutableArray array];
    for (int i = 0; i < 10000000; i ++) {
        [test addObject:@(i + 10)];
    }

    //For-in
    __block NSInteger index = 0;
    double date_s = CFAbsoluteTimeGetCurrent();
    for (NSNumber *num in test) {
        if ([num integerValue] == 9999999) {
            index = [test indexOfObject:num];
            break;
        }
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in Time: %f ms",(long)index,date_current * 1000);

    //enumerateObjectsUsingBlock
    index = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsUsingBlock:^(id num, NSUInteger idx, BOOL *stop) {
        if ([num integerValue] == 9999999) {
            index = idx;
            *stop = YES;
        }
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateBlock Time: %f ms",(long)index,date_current * 1000);

    //enumerateObjectsWithOptions
    index = 0;
    date_s = CFAbsoluteTimeGetCurrent();
    [test enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id num, NSUInteger idx, BOOL *stop) {
        if ([num integerValue] == 9999999) {
            index = idx;
            *stop = YES;
        }
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateObjectsWithOptions Time: %f ms",(long)index,date_current * 1000);

打印:

  

结论:通过Value查询index的时候, 面对大量的数组推荐使用 enumerateObjectsWithOptions的并行方法.

  1.3遍历字典

这里我们比较一下使用 For-in 和 enumerateKeysAndObjectsUsingBlock 这个两个方法:

    NSDictionary *testDictionary = @{
                                     @"Auther" : @"yyyyy",
                                     @"Game" : @"Dota",
                                     @"App" : @"dddddd",
                                     @"Market" : @"AppStore"
                                     };

    NSMutableArray *forInArry1 = [NSMutableArray array];
    NSMutableArray *forInArry2 = [NSMutableArray array];
    NSMutableArray *enumArry = [NSMutableArray array];

    //For - in方法 直接allValues
    double date_s = CFAbsoluteTimeGetCurrent();
    NSArray *values = testDictionary.allValues;
    for (NSString *value in values) {
        [forInArry1 addObject:value];
    }
    double date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in-forInArry1 Time: %f ms",(long)index,date_current * 1000);

    //For - in方法,+根据key取value值
    date_s = CFAbsoluteTimeGetCurrent();
    NSArray *keys = testDictionary.allKeys;
    for (NSString *key in keys) {
                NSString *Value = testDictionary[key];
        [forInArry2 addObject:Value];
    }
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld For-in-forInArry2 Time: %f ms",(long)index,date_current * 1000);

    //enumerateKeysAndObjectsUsingBlock方法.
    date_s = CFAbsoluteTimeGetCurrent();
    [testDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [enumArry addObject:obj];
    }];
    date_current = CFAbsoluteTimeGetCurrent() - date_s;
    NSLog(@"index : %ld enumerateKeysAndObjectsUsingBlock Time: %f ms",(long)index,date_current * 1000);
    

打印:

结论:遍历字典类型的时候, enumerateKeysAndObjectsUsingBlock效率最高

时间: 2024-10-12 04:30:26

NSArray其中的方法--遍历,的相关文章

NSArray NSMutableArray &nbsp; NSNumber 方法

@font-face {  font-family: "宋体";}@font-face {  font-family: "宋体";}@font-face {  font-family: "@宋体";}@font-face {  font-family: "Cambria";}@font-face {  font-family: "Heiti SC Light";}@font-face {  font-fam

非递归的方法遍历二叉树

//非递归遍历一棵树 需要借助栈 #include<stdio.h> #include<stdlib.h> struct Tree { int nValue; Tree *pLeft; Tree *pRight; }; struct Stack { Tree *root; Stack *pNext; }; Stack *pStack = NULL; void push(Tree *root) { Stack *temp = (Stack*)malloc(sizeof(Stack))

Swift中实现Array数组和NSArray数组的相互转换与遍历

Array是Swift中的数组数据类型.而NSArray是OC中的数组数据类型.两者有差别有联系.在Swift中有时候难免会使用到OC中的一些东西.今天我们就来Swift中使用NSArray和Array,而且进行转化. (1)声明一个Array数组.并进行遍历.代码例如以下: let stringArray: Array<String> = ["10", "20","30","40","50"]

使用each()方法遍历元素

使用each()方法遍历元素 使用each()方法可以遍历指定的元素集合,在遍历时,通过回调函数返回遍历元素的序列号,它的调用格式为: $(selector).each(function(index)) 参数function为遍历时的回调函数,index为遍历元素的序列号,它从0开始. 例如,遍历页面中的<span>元素,当元素的序列号为2时,添加名为“focus”的样式,如下图所示: 在浏览器中显示的效果: 从图中可以看出,在使用each()方法遍历<span>元素时,回调函数中

Ant步步为营(5)用for和foreach的方法遍历一个文件夹,查找到某个文件并删除

今天有个任务是要删除VM上的某个文件夹下的两个jar包.不过这个任务没有分配给我,而是分配给俺的师傅,哈哈.不过我还是自己动手写了一些脚本在本地模拟一下删除某个指定文件. build.xml <?xml version="1.0"?>    <project name="ForTest" default="build" >    <property file="build.properties"&

[OC Foundation框架 - 7] NSArray的创建与遍历

NSArray是不可变的,不能先创建再添加元素 NSArray可以放入任何OC对象,但不能放入基本数据类型.结构体.枚举等非OC对象 不能存储nil A.常用方法1 创建 返回用量 是否含有某元素 最后的元素 取得某位置的元素 当一个对象放入数组的时候,这个对象的计数器加1 1 #pragma mark create a array 2 void arrayCreate() 3 { 4 //Create an empty array 5 NSArray *array = [NSArray arr

08.21 javaScript07 object 概念 创建对象 创建属性操作 方法遍历 原型

# Object ###Object 的概念 * 对象可以看做是属性的无序集合 ### 创建对象Object * 直接量 {} * 构造函数 new Object() ### 对象属性的操作 * 运算符  . * 运算符 [] * 属性检测  in      console.log("name"in obj)true/flase * 删除属性 delete 无序的删除 没有副作用 ### 方法 * 方法也是属性 ### Object 遍历 * for  in * [] 运算符 一个大括

STL中用erase()方法遍历删除元素?.xml

pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9;font-style:italic;font-weight:bold;} .selfFuc{color:#f1f9be;} .bool{color:#69305e;} .condition{color:#628698;font-weight:bold;} .key{color:#e336b6;} .

第三讲.继承,完整初始化方法,遍历构造器,多态(代码) 另附植物大战僵尸练习

//初始化和遍历构造器使用 //person.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 { 6 7 NSString *_name; 8 int _age; 9 NSString *_sex; 10 11 12 } 13 14 +(id)PersonWithName:(NSString*)name age:(int)age; 15 -(id)initWithName:(NSStrin