OC_06_字典,集合


字典

字典用于保存具有映射关系(key-value对)数据的集合。 

与数组不同,字典靠key存取元素。

key不能重复,value必须是对象。

 键值对在字典中是无序存储的。

字典分:不可变字典(NSDictionary)和可变字典(NSMutableDictionary


NSDictionary:

字典一旦创建,键值对就不可更改,不可添加,不可删除。

仅能读取key或者value 

创建字典对象。

获取所有key值,获取所有value值。通过key值查询value。 



   

    //不可变字典  ObjectsAndKeys先存对象,在存对应的key

    NSDictionary *dic = [[NSDictionaryalloc]initWithObjectsAndKeys:@"king",@"name",@"23", @"age",nil];

//    NSLog(@"%@", dic);

    

    NSDictionary *dic1 = [NSDictionarydictionaryWithObjectsAndKeys:@"queen",@"name",@"22", @"age",nil];

//    NSLog(@"%@", dic1);

    

    //通过key找到对应的value

   NSLog(@"%@", [dic1objectForKey:@"name"]);

    

    //找到所有的key

   NSLog(@"%@",dic.allKeys);

    

    //找到所有value

    NSLog(@"%@",dic.allValues);

    

    //key-value对数

    NSLog(@"%ld", dic.allKeys.count);

    

   无序的

    字典中存放的时成对出现

    字典里的key不能重复


NSMutableDictionary

可变字典
NSDictionary的子类。可以对管理的键值对进行增、删、改。 


    //可变字典

    //创建空字典

    NSMutableDictionary *dic = [NSMutableDictionarydictionary];

    

    NSMutableDictionary *dic1 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"king",@"name",@"23", @"age",nil];

    NSMutableDictionary *dic2 = [[NSMutableDictionaryalloc]initWithObjectsAndKeys:@"queen",@"name",@"22", @"age",nil];

    

   

  //增加键值对

    [dic1 setObject:@"shopping" forKey:@"stuHobby"];

    NSLog(@"%@", dic);

    //如果key已经存在,相当于对这个key所对应的value进行重新赋值

    [dic1 setObject:@"24" forKey:@"age"];

     NSLog(@"%@", dic1);


    [dic setValue:@"LOL" forKey:@"stuHobby"];

     NSLog(@"%@", dic);

    //以上两个方法都可以实现对字典的value重新赋值的功能,但是setObject是字典的方法,setValueKVC的方法,不要弄混,我们应该使用字典自己的方法

    

    //删除键值对

    [dic1 removeObjectForKey:@"age"];

    NSLog(@"%@", dic1);



  //   用快速枚举的方式遍历字典  in后面放容器

   for(NSString*strin dic1) {

       NSLog(@"%@", [dic1objectForKey:str]);

   }

    //对字典使用快速枚举的方式进行遍历,in前面对应的是key的类型,然后再根据对应的key找到对应的value

     //字面量创建一个不可变字典

   NSLog(@"%@", dic1[@"name"]);

    //字面量创建一个字典前面是key,后面是value  数组输出的时候是(),字典是{}

    NSDictionary *d = @{@"stuName" :@"joker",@"age" :@"60" };

   NSLog(@"%@", d);



    //    字典套数组

    NSMutableArray *arr1 = [NSMutableArrayarrayWithObjects:@"1",@"2",@"3", @"4",@"5",nil];

    

    NSMutableArray *arr2 = [NSMutableArrayarrayWithObjects:@"6",@"7",@"8", @"9",@"10",nil];

    

    NSMutableDictionary *dic = [NSMutableDictionarydictionaryWithObjectsAndKeys:arr1,@"arr1", arr2,@"arr2"nil];

    

   for(NSString*strindic) {

       NSMutableArray*tempArr= [dic objectForKey:str]; //strkey,我们要的value

       for(NSString *tempStrintempArr) {

           NSLog(@"%@", tempStr);

        }

    }



  //数组套字典

    //知道每一层的结构,然后使用forin

    

    NSMutableDictionary *dic1 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"1",@"2", @"3", @"4",@"5", @"6", nil];

    

    NSMutableDictionary *dic2 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"7",@"8", @"9", @"10",nil];

    

   NSArray *arr = @[dic1, dic2];

    

    

    //    in 前的是结构里边的类型

   for (NSMutableDictionary *dicin arr) {

       for (NSString *strin dic) {

           NSLog(@"%@", [dicobjectForKey:str]);

        }

    }

    

   for (NSDictionary *dicin arr) {

       for (NSString *strin dic) {

           NSLog(@"%@", [dicobjectForKey:str]);

        }

    }



数组字典相互嵌套

   //  *****

    NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"2", @"3", @"4", @"5", @"6", nil];

    

    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"7", @"8", @"9", @"10", nil];

    

    NSArray *arr1 = @[dic1];

    NSArray *arr2 = @[dic2];

    

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:arr1, @"arr1", arr2, @"arr2", nil];


    

    for (NSString *dicStr in dic) {

        NSArray *dicArr = [dic objectForKey:dicStr];

        for (NSMutableDictionary *tempDic in dicArr) {

            for (NSString *str in tempDic) {

                NSLog(@"%@", [tempDic objectForKey:str]);

            }

        }

    }

       

    //打开第一层,最外层是一个字典

    for (NSString *dicStr in dic) {

        NSArray *dicArr = [dic objectForKey:dicStr];

       //打开第二次,中间是数组

        for (NSMutableDictionary *tempDic in dicArr) {

            //打开最后一层

            for (NSString *str in tempDic) {

                NSLog(@"%@", [tempDic objectForKey:str]);

            }

        }

    }

//容器之间互相嵌套,解决方法就是 明确 容器的数据类型,然后一层一层解析里面对应的数据类型



集合(Set)


    NSSet *set = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"5", nil];

//    NSLog(@"%@", set);

    

    //集合的创建方法和数组相似, 但是数组是有序的,集合是无序的,而且集合里的对象是唯一的

    

    // 遍历构造器的方式创建一个集合

    NSSet *set1 = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", nil];

//    集合中如果有相同的对象,把这个对象当成一个对象来看

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

    

//    对集合使用forin进行遍历

    for (NSString *str in set) {

        NSLog(@"%@", str);

    }

    

//    集合是否包含某一个对象

    NSLog(@"%d", [set containsObject:@"2"]);

    

    // 集合里的某一个对象

    NSLog(@"%@", [set anyObject]);


    //对数组进行排序

    

//    对不可变数组进行排序

    NSArray *arr = [NSArray arrayWithObjects:@"king", @"queen", @"joker", @"aaa", @"sss", nil];

    //方法选择器

    //括号里边就是我们要选择使用的方法

    SEL method = @selector(compare:);

    

    //用一个新的数组来接受排序之后的结果

    NSArray *newArr = [arr sortedArrayUsingSelector:method];

    NSLog(@"%@", newArr);

    

//    对可变数组进行排序

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"king", @"queen", @"joker", @"aaa", @"sss", nil];

    

    [arr sortUsingSelector:@selector(compare:)];

    NSLog(@"%@", arr);


集合特点:

与数学中的集合一样,集合中的元素唯一存储的元素是无序的
存储元素必须是对象类型

iOS中⽤用Set表⽰示集合,分NSSetNSMutableSet 


NSCountedSetNSMutableSet的子类能记录元素的重复次数。

set的基础上添加了计数功能。

- countForObject: 


排序:

数组排序取决于判断条件,判断条件决定了排序的方式(升序、
降序)。

iOS为数组类提供了排序方法,同时提供了接口让我们传递判断条件。

[array sortedArrayUsingSelector:<#(SEL)#>]

[mutableArray sortUsingSelector:<#(SEL)#>]

@selector,获取⽅方法名。这个方法名是数组中元素的方法默认使⽤用升序排列。


 



总结:

forin

for (<#type *object#> in <#collection#>) {
 }
1object是遍历得到的元素对象。2collection是集合类型的对象:数组、字典、集合。 

数组枚举得到数组中的元素对象

字典枚举得到字典中的key

集合枚举得到集合中的元素对象。 


字典是一种存储键值对的容器,靠key来索引数据。集合存储的数据无序、不重。
for(type *obj in collection)OC中快速遍历数据的方式。数组封装了排序,同时为我们提供了接口,方便我们控制排序。每一种collection都有自己特点,使用符合自己需求的collection。 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值