【Foundation】18-集合类NSArray、NSSet、NSDictionary


一、NSArray

1.1 NSArray是OC数组,是不可变数组。OC数组只能存放OC对象,不能存放非OC对象类型,比如int、struct、enum等。

1.2 NSArray不能存放nil值。nil值是数组元素结束的标记。

1.3 NSArray的创建

    1> 创建空数组

      NSArray *array = [NSArray array]; // 这种方式创建的array永远是空数组

     2> 创建单个元素的数组

      NSArray *array2 =[NSArray arrayWithObject:@"jack"]; 

     3> 创建多个元素的数组

      NSArray *array3 = [NSArray arrayWithObjects:@"jack",@"jim",@"rose", nil]; // nil是数组元素结束的标记

     4> 快速创建一个NSArray对象

      NSArray *array4 = @[@"jack",@"jim",@"rose"];

1.4 NSArray的元素的个数

     NSLog(@"%ld",array4.count);

1.5 NSArray中元素的访问

   1> 调用objectAtIndex 

        NSLog(@"%@",[array3 objectAtIndex:2]);

   2> 下标访问:

        NSLog(@"%@",array3[2]);

1.6 NSArray元素的遍历

    1> 经典for循环遍历

     for(int i=0;i<array3.count;i++){
        NSLog(@"%@",array3[i]);
     }

    2> for枚举遍历

     for(id obj in array3){
        //找出obj元素在数组中的位置
        NSUInteger i = [array3 indexOfObject:obj];
        NSLog(@"%ld-%@",i,obj);
        if(i==1)
        {
            break;
        }
     }

    3> block遍历

    [array3 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld-%@",idx,obj);
        if(idx==1)
        {   //停止遍历
            *stop=YES;
        }
    }];

  

    block遍历的原理:

 
        void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
        {
            NSLog(@"%ld - %@", idx, obj);
    
    
            if (idx == 0)
            {
                // 停止遍历
                *stop = YES;
            }
        };
    
        for (int i = 0; i<array.count; i++)
        {
            // 用来标记是否需要停止遍历
            BOOL isStop = NO;
    
            // 取出元素
            id obj = array[i];
            
            myblock(obj, i, &isStop);
            
            
            if (isStop)
            {
                break;
            }
        }

二、NSMutableArray

2.1 NSMutableArray是NSArray的子类,它是可变的OC数组。

2.2 OC数组只能存放OC对象,不能存放nil和非OC对象的数据。

2.3 NSMutableArray对象的创建和初始化

      NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose",@"jim", nil];

2.4 添加元素

      [array addObject:@"jack"];

2.5 删除元素

   1> 删除所有元素

        [array removeAllObjects];

   2> 删除指定元素
    [array removeObject:@"jim"];

   3> 删除指定下标
    [array removeObjectAtIndex:0];

2.6 打印数组
    NSLog(@"%@",array);

2.7 注意

    @[] 只创建不可变数组NSArray。不能使用如下方法创建可变数组:

    NSMutableArray *array = @[@"jim",@"tom"]; // 错误


三、NSSet

3.1 NSSet是无序的集合,在内存中存储方式是不连续的,用于存放多个OC对象。

3.2 NSSet的创建和初始化

      NSSet *s = [NSSet setWithObjects:@"jack",@"rose",@"jim",@"lili",nil];

3.3 随机取出一个元素

     NSString *str = [s anyObject];

3.4 NSSet和NSArray的对比 

    1>共同点:

       * 都是集合,都能存放多个OC对象

       * 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)

       * 本身都不可变,都有一个可变的子类

    2> 不同点:NSArray有顺序,NSSet没有顺序


4、NSMutableSet

4.1 NSMutableSet的初始化

      NSMutableSet *s = [NSMutableSet set];

4.2 添加元素

      [s addObject:@"jack"];

4.3 删除元素

     [s removeObject:@"jack"]; 


五、NSDictionary

5.1 NSDictionary叫做字典,它里面存储的是一个个键值对。它可以根据key找到相对应的value,即可以通过索引快速找到内容。

5.2 NSDictionary对象的创建

   1> 创建单个元素的NSDictionary对象

        NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

   2> 创建多个元素的NSDictionary对象

      *  NSArray *keys = @[@"name",@"address"];
         NSArray *objects = @[@"jack",@"北京"];
         NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];


      * NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
        @"jack",@"name",
        @"北京",@"address",
        @"2334343",@"qq",nil];


    3> 快速创建多个元素的NSDictionary对象(常用)

         NSDictionary *dict = @{@"name":@"jack",@"address":@"北京"};

5.3 获取指定键的值

    1> id obj = [dict objectForKey:@"name3"];

    2> id obj = dict[@"name"];// 简便方式,常用

5.4 如果获取不到指定键的值,返回null。

5.5 打印键值对的个数

    NSLog(@"%ld",dict.count);


六、NSMutableDictionary

    6.1 NSMutableDictionary是可变键值对的字典,键值对的存储是没有顺序的。

    6.2 NSMutableDictionary对象的创建

          NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    6.3 NSMutableDictionary元素的添加

          [dict setObject:@"jack"forKey:@"name"];
          [dict setObject:@"北京" forKey:@"address"];

    6.4 NSMutableDictionary元素的更改:对一个已经存在的键调用setObject可以更改元素内容,覆盖旧值

         [dict setObject:@"jack" forKey:@"name"]; //dict[@"name"]的值是jack

         [dict setObject:@"rose" forKey:@"name"]; //dict[@"name"]的值是rose

    6.5 NSMutableDictionary键值对的移除

         [dict removeObjectForKey:@"name"];

    6.6 NSMutableDictionary的遍历

       1> for循环遍历

    // 声明并初始化字典
    NSDictionary *dict = @{@"name":@"jack",@"name2":@"rose",@"qq":@"4454546",@"address":@"北京"};
    // 获取所有的key值
    NSArray *keys = [dict allKeys];
    //NSLog(@"%@",keys);
    for(int i=0;i<dict.count;i++){
        NSString *key=keys[i]; // 获取key值
        NSString *object = dict[key]; // 获取key对应的value值
        
        NSLog(@"%@=%@",key,object);
    }


     2> block遍历(enumerateKeysAndObjectsUsingBlock)
 // 声明并初始化字典
    NSDictionary *dict = @{@"name":@"jack",@"name2":@"rose",@"qq":@"4454546",@"address":@"北京"};
    // 调用block遍历字典
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@-%@",key,obj);
        //*stop=YES; //停止遍历
    }];


    6.7 NSDictionary数组

    NSArray *persons=@[
      @{@"name":@"jack",@"address":@"北京",@"books":@[@"7天突破IOS缟程",@"7天突破android"]},
      @{@"name":@"jack2",@"address":@"南京"},
      @{@"name":@"jack3",@"address":@"东京"},
      @{@"name":@"jack4",@"address":@"上海"},
    ];
    NSDictionary *jack3 = persons[2];
    NSLog(@"%@",jack3);
    // 先取出下标2位置对应的字典,再取出字典中address这个key对应的数据
    NSLog(@"%@",persons[2][@"address"]);
    
    NSString *bookName=persons[0][@"books"][1];  // 取出书名
    NSLog(@"%@",bookName);




    6.7 注意

       1> 字典不允许有相同的key,但允许有相同的value(Object)

       2> 字典是无序的

7、小结

    7.1 NSArray\NSMutableArray

       * 有序

       * 快速创建(不可变):@[obj1,obj2,obj3]

       * 快速访问元素:数组名[i];


     7.2 NSSet\NSMutableSet 

        * 无序

  

     7.3 NSDictionary\NSMutableDictionary

        * 无序

        * 快速创建:@{key1:value1, key2:value2}

        * 快速访问元素:字典名[key] 


八、计算代码行数的例子

#import <Foundation/Foundation.h>
//计算单个文件的代码行数
/*
 path: 文件的全路径
 返回值 int : 代码行数
 */
NSUInteger codeLineCount2(NSString *path)
{
    
    // 1.加载文件内容
    NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    //NSLog(@"%@",content);
    
    // 2.将文件内容切割成每一行
    NSArray *array=[content componentsSeparatedByString:@"\n"];
    
//    int i=0;
//    for(NSString *line in array)
//    {
//        NSLog(@"%d-%@",i,line);
//        i++;
//    }
    
    return array.count;
}


//计算文件夹的代码行数
/*
 path: 文件的全路径(可能是文件夹,也可能是文件)
 返回值 int : 代码行数
 */
NSUInteger codeLineCount(NSString *path)
{
    // 1.获得文件管理者,它是单例模式,不管调用多少次都只有一个对象
    NSFileManager *mgr= [NSFileManager defaultManager];
    
    // 2.判断path是文件夹还是文件路径
    BOOL dir = NO; // 标记是否为文件夹
    
    // 3.这个路径是否存在
    BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
    
    // 4.如果不存在,直接返回0
    if(!exist)
    {
        NSLog(@"文件路径不存在!");
        return 0;
    }
    
    
    // 5.说明路径存在
    if(dir){
        // NSLog(@"是个文件夹");
        // 装着当前文件夹下面的所有内容(文件夹\文件)
        NSArray *array=[mgr contentsOfDirectoryAtPath:path error:nil];
        int count = 0;
        // 遍历数组中的所有文件(夹)名
        for(NSString *filename in array)
        {
            NSString *fullPath = [NSString stringWithFormat:@"%@/%@",path,filename ];
            // 累加每个子路径的总行数
            count +=codeLineCount(fullPath);
        }
        return count;
    }
    else{
        //NSLog(@"是个文件");
        // 1.判断文件的拓展名
        NSString *extension = [[path pathExtension] lowercaseString];
        if(![extension isEqualTo:@"h"] && ![extension isEqualTo:@"c"] &&![extension isEqualTo:@"m"])
        {
            // 文件拓展名不是h,而且也不是m,而且也不是c
            return 0;
        }

        
        // 2.加载文件内容
        NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        
        
        // 3.将文件内容切割成每一行
        NSArray *array=[content componentsSeparatedByString:@"\n"];
        
        NSRange range = [path rangeOfString:@"/Users/zhanghong/Desktop/code/oc/"];
        NSString *str = [path stringByReplacingCharactersInRange:range withString:@""];
        NSLog(@"%@-%ld",str,array.count);
        return array.count;

    }
}



int main() {
    int count =codeLineCount(@"/Users/zhanghong/Desktop/code/oc");
    NSLog(@"%d",count);
    return 0;
}




   





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值