NSArray,NSDictionary,NSSet用法及区别

本文详细介绍了Objective-C中的几种集合类,包括NSArray、NSSet、NSDictionary及其可变版本的使用方法,覆盖初始化、遍历、排序及转换等内容,并提供了具体的代码示例。

    NSString * str1 = @"one";

    NSString * str2 = @"two";

    NSString * str3 = @"three";    

-NSArray
1、初始化、取值等基础操作     
     NSArray 是不可变数组,一旦创建完成就不能够对数组进行,添加,删除等操作
    

   NSArray * array1 = [NSArray arrayWithObjects:str1,str2,str3,str1,nil];

     在创建一个NSArray的时候最后一个元素一定是nil 不要把nil存到数组中,会导致数据丢失
   
     创建数组的快捷方式
     NSArray * array = @[@"a",@"b",@"c"];
 
2、遍历数组
    a、普通的for循环
        for (int i = 0; i < array.count; i++)
        {
            NSString * str = array[i];
            NSLog(@"array[%d] = %@",i,str);
        }
    b、使用增强for循环的方式遍历数组
        for (NSString * str in array)
        {
            NSLog(@"str = %@",str);
        }
    c、枚举器
        NSArray * array = @[@"one",@"two",@"three"];
        NSEnumerator * enumerator =  [array objectEnumerator];
        NSString * value;
        while (value = [enumerator nextObject]) {
            NSLog(@"enum str %@",value);
        }
3、数组排序
    a、使用sortedArrayUsingSelector
    [array sortedArrayUsingSelector:@selector(compare:)]  
    b、使用block方式排序
     array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id             obj1, id obj2) {
            
            /*
            NSComparisonResult result = [obj1 compare:obj2];
            
            return result;
             */
            //obj1 compare obj2 就是正序排序
         //return [obj1 compare:obj2];
            //obj2 compare obj1 就是倒序排序
            return [obj2 compare:obj1];
        }];
     如果你向给你自己定义的对象排序,必须根据某一个属性来排序,
     sortDescriptorWithKey 参数要的就是你对象中,要依据哪个属性来排序,你就把哪个属性的名字当成key传入
      ascending YES表示正序 NO表示倒叙
      NSSortDescriptor * d1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
      NSSortDescriptor * d2 = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:NO];
        
     如果你要使用多个属性进行排序,默认在前面的NSSortDescriptor优先级比较高
        NSArray * description = @[d2,d1];
        
        array3 = [array3 sortedArrayUsingDescriptors:description];
4、可变数组NSMutableArray
    创建可变数组
    NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0];
    -使用addObject 动态给数组中增加元素
    [array addObject:@“one"];
    -数组中可以存储,同一个对象多次
    -指定对象插入的位置
     [array insertObject:str1 atIndex:2];
    -删除 会通过对象,删除数组中所有的同一个地址的对象
    [array removeObject:str1];
    -通过索引的方式删除对象,超出了数组的count值,那么就会导致异常 index beyond bounds
    [array removeObjectAtIndex:0];
    [array removeAllObjects];
-NSDictionary
1、初始化
    -创建字段,不可变的
      NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"s",@"name", nil];
    -快捷创建方式
      NSDictionary * dic2 = @{ @"one":@"1",@"two":@"2"};
      dic2.count  获得字典长度
2、遍历
       NSArray * keys = [dic3 allKeys];
        for (int i = 0; i < keys.count; i++)
        {
            NSString * key = [keys objectAtIndex:i];
            
            //如果你的字典中存储的多种不同的类型,那么最好用id类型去接受它
            id obj  = [dic3 objectForKey:key];
            NSLog(@"obj %@",obj);
        }
      —枚举器
        NSEnumerator * enumerator =  [dic3 objectEnumerator];
        id value;
        while (value = [enumerator nextObject]) {
            NSLog(@"value %@",value);
        }
3、可变字典NSMutableDictionary
    -创建一个可变长度字典
      NSMutableDictionary * muDic = [[NSMutableDictionary alloc] initWithCapacity:0];
    -向字典中村如数据
     [muDic setObject:@"1" forKey:@"one"];
    -删除
     [muDic removeObjectForKey:@“one"];
    -全部删除
     [muDic removeAllObjects];
-NSSet
1、NSSet是无序的
     注意:这个是最为重要的功能 NSSet中不能够存储重复的数据,可以用它来去除重复的值
     

   NSSet * set1 = [[NSSet alloc] initWithObjects:str1,str2,str3,str1, nil];

     这样其实在set中指存储了 @“one”,@“two”,@“three” set.count 值为3 【看最下面实例】

2、遍历
    NSEnumerator * enumerator = [set objectEnumerator];
        NSString * value;
        while (value = [enumerator nextObject]) {
            NSLog(@"value %@",value);
        }
3、可变集合NSMutableSet
    -创建一个可变集合
      NSMutableSet * muSet = [[NSMutableSet alloc] init];
    -增加值
      [muSet addObject:str1];
    -删除
      [muSet removeObject:str1];
    -删除所有
    [muSet removeAllObjects];

-集合之间相互转换
1.NSArray 转换成 NSMutableArray
    NSArray * array = @[@"one",@"two",@"three"];
      NSMutableArray * muArray = [NSMutableArray arrayWithArray:array];
2.NSDictionary 转换成        NSMutableDictionary
    NSDictionary * dic = @{@"one":@"1",@"two":@"2"};
      NSMutableDictionary * muDic = [NSMutableDictionary     dictionaryWithDictionary:dic];
3.NSSet 转换成 NSMutableSet
    NSSet * set = [[NSSet alloc] initWithObjects:@"one",@"two", nil];
      NSMutableSet *muSet = [NSMutableSet setWithSet:set];
4.NSArray 转换成NSSet
      NSMutableSet * muSet2 = [NSMutableSet setWithArray:array];
5.NSDictionary 转化成NSArray
        NSArray * keys = [dic allKeys];
        NSArray * values = [dic allValues];
6.字符串转换成数组
        NSString * str = @"aa.bb.cc";
        NSArray * strArray =[str componentsSeparatedByString:@“."];



实例:

    NSString * str1 = @"one";

    NSString * str2 = @"two";

    NSString * str3 = @"three";

    

    //数组  不可变

    NSArray * array1 = [NSArray arrayWithObjects:str1,str2,str3,str1,nil];

    NSLog(@"数组  不可变 array1 count: %ld",[array1 count]);

    NSLog(@"数组  不可变 内容: %@",array1);

    

    //集合  不可变

    NSSet * set1 = [[NSSet alloc] initWithObjects:str1,str2,str3,str1, nil];

    NSLog(@"集合  不可变 array1 count: %ld",[set1 count]);

    NSLog(@"集合  不可变 内容: %@",set1);

    

    

    //数组  可变

    NSMutableArray * array2 = [NSMutableArray new];

    [array2 addObject:str1];

    [array2 addObject:str2];

    [array2 addObject:str3];

    [array2 addObject:str1];

    NSLog(@"数组  可变 array1 count: %ld",[array2 count]);

    NSLog(@"数组  可变 内容: %@",array2);

    

    //集合  可变

    NSMutableSet * set2 = [[NSMutableSet alloc] init];

    [set2 addObject:str1];

    [set2 addObject:str2];

    [set2 addObject:str3];

    [set2 addObject:str1];

    NSLog(@"集合  可变 array1 count: %ld",[set2 count]);

    NSLog(@"集合  可变 内容: %@",set2);

    

    

    //数组转 集合

    NSMutableSet * set3 = [NSMutableSet setWithArray:array1];

    NSLog(@"数组转集合  内容: %@",set3);


输出日志:

2017-10-10 17:22:02.651060+0800 setAndArray[1558:84219] 数组  不可变 array1 count: 4

2017-10-10 17:22:02.651173+0800 setAndArray[1558:84219] 数组  不可变 内容: (

    one,

    two,

    three,

    one

)

2017-10-10 17:22:02.651213+0800 setAndArray[1558:84219] 集合  不可变 array1 count: 3

2017-10-10 17:22:02.651269+0800 setAndArray[1558:84219] 集合  不可变 内容: {(

    one,

    three,

    two

)}

2017-10-10 17:22:02.651289+0800 setAndArray[1558:84219] 数组  可变 array1 count: 4

2017-10-10 17:22:02.651325+0800 setAndArray[1558:84219] 数组  可变 内容: (

    one,

    two,

    three,

    one

)

2017-10-10 17:22:02.651345+0800 setAndArray[1558:84219] 集合  可变 array1 count: 3

2017-10-10 17:22:02.651372+0800 setAndArray[1558:84219] 集合  可变 内容: {(

    one,

    two,

    three

)}


//装换成集合后  自动去除重复值的对象

2017-10-10 17:08:23.366852+0800 setAndArray[1415:73533] 数组转集合  内容: {(

    one,

    three,

    two

)}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值