数组和字典

一、数组和数组排序

1.创建数组


1 // 创建一个空的数组  

2 NSArray *array = [NSArray array];      

3 // 创建有1个元素的数组  

4 array = [NSArray arrayWithObject:@"123"];  

5 // 创建有多个元素的数组  

6 array = [NSArray arrayWithObjects:@"a"@"b"@"c", nil nil];  

7 NSArray *array3 = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4"@"5", nil nil]];  

8   

9 NSArray *array4 = [NSArray arrayWithObjects:@"1"@"2"@"3"@"4", nil nil];  

10 NSRange range = NSMakeRange(1, 2);  

11 NSArray *array5 = [array4 subarrayWithRange:range];  




2.数组的一些基本方法

1 int count = [array count];//个数  

2 // 判断是否包含了某个元素  

3 if ([array containsObject:@"a"]) {  

4     NSLog(@"包含了字符串a");  

5 }  

6 NSString *last = [array lastObject];最后一个元素  

7 NSString *str = [array objectAtIndex:1];根据索引获取数组中的元素  

8 int index = [array indexOfObject:@"c"];获取指定元素的索引  

9 // 让数组里面的所有对象都调用test方法,123为参数  

10 NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil nil];  

11 [array makeObjectsPerformSelector:@selector(test2:) withObject:@"123"];  

12 NSArray *array = [NSArray arrayWithObjects:@"1"@"2"@"3"@"4", nil nil];  

13 // 1-2-3-4  

14 // 利用分隔符-拼接所有的数组元素  

15 NSString *str = [array componentsJoinedByString:@"-"];  

16 // 将一个数组写入文件(生成的是一个xml文件)  

17 NSString *path = @"/Users/apple/Desktop/array.xml";  

18 [array writeToFile:path atomically:YES];  

19 path = @"/Users/apple/Desktop/array.txt";  

20 // 从文件中读取数组内容(文件有严格的格式要求)  

21 NSArray *array2 = [NSArray arrayWithContentsOfFile:path];  


3.遍历数组

1 #pragma mark 遍历数组1  

2 void arrayFor1() {  

3     NSArray *array = [NSArray arrayWithObjects:stu1, @"1"@"2"@"3", nil nil];  

4     int count = array.count;  

5     for (int i = 0; i<count; i++) {  

6         id obj = [array objectAtIndex:i];  

7     }  

8 }  

9   

10 #pragma mark 遍历数组2 快速遍历  

11 void arrayFor2() {  

12     Student *stu1 = [Student student];  

13     NSArray *array = [NSArray arrayWithObjects:stu1, @"1"@"2"@"3", nil nil];  

14     int i =0;  

15     for (id obj in array) {  

16         NSLog(@"%i-%@", i, obj);  

17         i++;  

18     }  

19 }  

20   

21 #pragma mark 遍历数组3  

22 void arrayFor3() {  

23     Student *stu1 = [Student student];  

24     NSArray *array = [NSArray arrayWithObjects:stu1, @"1"@"2"@"3", nil nil];  

25     [array enumerateObjectsUsingBlock:  

26      ^(id obj, NSUInteger idx, BOOLBOOL *stop) {  

27         NSLog(@"%i-%@", idx, obj);  

28          // 如果索引为1,就停止遍历  

29          if (idx == 1) {  

30              // 利用指针修改外面BOOL变量的值  

31              *stop = YES;  

32          }  

33     }];  

34 }  

35   

36 #pragma mark 遍历数组4  

37 void arrayFor4() {  

38     Student *stu1 = [Student student];  

39     NSArray *array = [NSArray arrayWithObjects:stu1, @"1"@"2"@"3", nil nil];  

40     // 获取数组的迭代器  

41     // NSEnumerator *enumerator = [array objectEnumerator];  

42     // 反序迭代器(从尾部开始遍历元素)  

43     NSEnumerator *enumerator = [array reverseObjectEnumerator];  

44     // allObjects是取出没有被遍历过的对象  

45     NSArray *array2 = [enumerator allObjects];  

46     NSLog(@"array2:%@", array2);  

47     // 获取下一个需要遍历的元素  

48     id obj = nil;  

49     while (obj = [enumerator nextObject]) {  

50         NSLog(@"obj=%@", obj);  

51     } } 




4.数组排序


1 #pragma mark 数组排序1  

2 void arraySort1() {  

3     NSArray *array = [NSArray arrayWithObjects:@"2"@"3"@"1"@"4", nil nil];  

4       

5     // 返回一个排好序的数组,原来数组的元素顺序不会改变  

6     // 指定元素的比较方法:compare:  

7     NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)];  

8     NSLog(@"array2:%@", array2);  

9 }  

10   

11 #pragma mark 数组排序2  

12 void arraySort2() {  

13     Student *stu1 = [Student studentWithFirstname:@"MingJie" lastname:@"Li"];  

14     Student *stu2 = [Student studentWithFirstname:@"LongHu" lastname:@"Huang"];  

15     Student *stu3 = [Student studentWithFirstname:@"LianJie" lastname:@"Li"];  

16     Student *stu4 = [Student studentWithFirstname:@"Jian" lastname:@"Xiao"];  

17     NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3, stu4, nil nil];  

18     // 指定排序的比较方法  

19     NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)];  

20     NSLog(@"array2:%@", array2);  

21 }  

22 - (NSComparisonResult)compareStudent:(Student *)stu {  

23     // 先按照姓排序  

24     NSComparisonResult result = [self.lastname compare:stu.lastname];  

25     // 如果有相同的姓,就比较名字  

26     if (result == NSOrderedSame) {  

27         result = [self.firstname compare:stu.firstname];  

28     }  

29     return result;  

30 }  

31   1 #pragma mark 数组排序3  

2 void arraySort3() {  

3     Student *stu1 = [Student studentWithFirstname:@"MingJie" lastname:@"Li"];  

4     Student *stu2 = [Student studentWithFirstname:@"LongHu" lastname:@"Huang"];  

5     Student *stu3 = [Student studentWithFirstname:@"LianJie" lastname:@"Li"];  

6     Student *stu4 = [Student studentWithFirstname:@"Jian" lastname:@"Xiao"];  

7     NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3, stu4, nil nil];  

8       

9     // 利用block进行排序  

10     NSArray *array2 = [array sortedArrayUsingComparator:  

11      ^NSComparisonResult(Student *obj1, Student *obj2) {  

12          // 先按照姓排序  

13          NSComparisonResult result = [obj1.lastname compare:obj2.lastname];  

14          // 如果有相同的姓,就比较名字  

15          if (result == NSOrderedSame) {  

16              result = [obj1.firstname compare:obj2.firstname];  

17          }  

18            

19          return result;  

20     }];  

21       

22     NSLog(@"array2:%@", array2);  

23 }  

24   

25 #pragma mark 数组排序4-高级排序  

26 void arraySort4() {  

27     Student *stu1 = [Student studentWithFirstname:@"MingJie" lastname:@"Li" bookName:@"book1"];  

28     Student *stu2 = [Student studentWithFirstname:@"LongHu" lastname:@"Huang" bookName:@"book2"];  

29     Student *stu3 = [Student studentWithFirstname:@"LianJie" lastname:@"Li" bookName:@"book2"];  

30     Student *stu4 = [Student studentWithFirstname:@"Jian" lastname:@"Xiao" bookName:@"book1"];  

31     NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3, stu4, nil nil];  

32       

33     // 1.先按照书名进行排序  

34     // 这里的key写的是@property的名称  

35     NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];  

36     // 2.再按照姓进行排序  

37     NSSortDescriptor *lastnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];  

38     // 3.再按照名进行排序  

39     NSSortDescriptor *firstnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES];  

40     // 按顺序添加排序描述器  

41     NSArray *descs = [NSArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil nil];  

42       

43     NSArray *array2 = [array sortedArrayUsingDescriptors:descs];  

44       

45     NSLog(@"array2:%@", array2);  

46 }   



二、字典和字典排序

1.字典

字典使用Key-Value的形式储存数据。

字典中的对象储存没有顺序,使用key来表示每个对象。

cocoa框架中的字典:NSDictionary和NSMutableDictionary

NSMutableDictionary是NSictionary的子类,能使用其所有方法。

NSMutableDictionary是NSDictionary的可修改版本



#import


int main(int argc, const char * argv[])

{


    @autoreleasepool {

        //不可变字典NSDictionary

        //字典的创建

        NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"velue" forKey:@"k1"];//一个键 一个值

        NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:@"v1",@"k1",@"v2",@"k2",@"v3",@"k3",@"v4",@"k4",@"v5",@"k5",nil];//创建多个键 多个值

        NSDictionary *dic3=[NSDictionary dictionaryWithDictionary:dic1];//直接把dic内容给dic3

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

        NSLog(@"dic2:%@",dic2);

        NSLog(@"dic3:%@",dic3);

        

        //获取字典的数量

        int count=[dic2 count];

        NSLog(@"%d",count);

        //获取k3的value

        NSString *string=[dic2 objectForKey:@"k3"];

        NSLog(@"value:%@",string);

        

        //获取字典中所有的key和value

        NSArray *keyArray=[dic2 allKeys];

        NSArray *valueArry=[dic2 allValues];

        NSLog(@“keyArray:%@valueArry:%@",keyArray,valueArry);

//可变字典NSMutableDictionary

        NSMutableDictionary *mutableDic1=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"v1",@"k1",@"v2",@"k2",@"v3",@"k3",@"v4",@"k4",@"v5",@"k5", nil];

        //上面是类方法直接赋值 下面是实例方法开辟空间并赋值

        NSMutableDictionary *mutableDic=[[NSMutableDictionary alloc]initWithObjectsAndKeys:@"v1",@"k1",@"v2",@"k2",@"v3",@"k3",@"v4",@"k4",@"v5",@"k5", nil];

        

        //将一个字典中的velue和key添加到另外一个字典中

        NSDictionary *dic4=[NSDictionary dictionaryWithObject:@"v6" forKey:@"k6"];

        [mutableDic addEntriesFromDictionary:dic4];

        NSLog(@"MutableDic%@",mutableDic);

        

        //向字典中添加新的velue和key

        [mutableDic setValue:@"object" forKey:@"key"];

        NSLog(@"%@",mutableDic);

        

        

        //创建一个空的字典数组

        NSMutableDictionary *mutableDic2=[NSMutableDictionary dictionary];

        [mutableDic2 setDictionary:mutableDic];//

        NSLog(@"dic2:%@",mutableDic2);

        

        //通过制定key删除

        [mutableDic2 removeObjectForKey:@"k4"];

        NSLog(@"dic2:%@",mutableDic2);

        

        //删除多个键值

        NSArray *keys=[NSArray arrayWithObjects:@"k1",@"k2",@"k3", nil];

        [mutableDic2 removeObjectsForKeys:keys];

        NSLog(@"dic2:%@",mutableDic2);

        

        

        //删除全部键值

//        [mutableDic2 removeAllObjects];

//        NSLog(@"dic2:%@",mutableDic2);


  //遍历字典  一般的方法

        for (int index=0;index<[mutableDic1 count]; index++) {

            NSString *object=[mutableDic1 objectForKey:[[mutableDic1 allKeys]objectAtIndex:index]];

            NSLog(@"object:%@",object);

        }

        //快速枚举

        NSLog(@"____________________");

        for (NSString *key in mutableDic1) {

            NSString *object=[mutableDic1 objectForKey:key];

            NSLog(@"object:%@",object);

        }

        NSLog(@"____________________");

        //使用枚举类型

        NSEnumerator *enumerator=[mutableDic1 keyEnumerator];

        id key;

        while(key=[enumerator nextObject]){

            id object=[mutableDic1 objectForKey:key];

            NSLog(@“object:%@",object);  

        }      

    }

    return 0;

}



2.字典的排序

#import <foundation foundation.h="">

 

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // 1.定义一个测试的字典数组

        NSMutableArray *dictArray = @[

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:0],

                                          @"FOrder" : [NSNumber numberWithInt:0],

                                          @"FName" : @"宝玉"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:1],

                                          @"FOrder" : [NSNumber numberWithInt:0],

                                          @"FName" : @"黛玉"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:0],

                                          @"FGroupTag" : [NSNumber numberWithInt:1],

                                          @"FOrder" : [NSNumber numberWithInt:1],

                                          @"FName" : @"宝钗"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:1],

                                          @"FOrder" : [NSNumber numberWithInt:2],

                                          @"FName" : @"湘云"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:2],

                                          @"FOrder" : [NSNumber numberWithInt:0],

                                          @"FName" : @"妙玉"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:3],

                                          @"FOrder" : [NSNumber numberWithInt:0],

                                          @"FName" : @"晴雯"

                                          },

                                      @{

                                          @"FEnabled" : [NSNumber numberWithInt:1],

                                          @"FGroupTag" : [NSNumber numberWithInt:3],

                                          @"FOrder" : [NSNumber numberWithInt:1],

                                          @"FName" : @"袭人"

                                          }

                                       

                                      ];


// NSArray 转成 NSMutableArray

        // 0、对于不启用的,即enabled为0的字典模型,删除掉

        NSMutableArray *dictArr = [NSMutableArray array];

        for (int i = 0; i < dictArray.count; i++) {

            NSDictionary *dict = dictArray[i];

            if ([[dict objectForKey:@"FEnabled"]intValue] == 1) {

                [dictArr addObject:dict];

            }

        }

        // NSLog(@"清除未启用的字典后的数组:%@",dictArr);

         

        // 1、对数组按GroupTag排序

        NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"FGroupTag" ascending:YES]];

        NSArray *sortedArr = [dictArr sortedArrayUsingDescriptors:sortDesc];

        // NSLog(@"排序后的数组:%@",sortedArr);

         

         

        // 2、对数组进行分组,按GroupTag

        // 遍历,创建组数组,组数组中的每一个元素是一个模型数组

        NSMutableArray *_groupArr = [NSMutableArray array];

        NSMutableArray *currentArr = [NSMutableArray array];

        NSLog(@"class--%@",[currentArr class]);

        // 因为肯定有一个字典返回,先添加一个

        [currentArr addObject:sortedArr[0]];

        [_groupArr addObject:currentArr];

        // 如果不止一个,才要动画添加

        if(sortedArr.count > 1){

            for (int i = 1; i < sortedArr.count; i++) {

                // 先取出组数组中  上一个模型数组的第一个字典模型的groupID

                NSMutableArray *preModelArr = [_groupArr objectAtIndex:_groupArr.count-1];

                int preGroupID = [[[preModelArr objectAtIndex:0] objectForKey:@"FGroupTag"] intValue];

                // 取出当前字典,根据groupID比较,如果相同则添加到同一个模型数组;如果不相同,说明不是同一个组的

                NSDictionary *currentDict = sortedArr[i];

                int groupID = [[currentDict objectForKey:@"FGroupTag"] intValue];

                if (groupID == preGroupID) {

                    [currentArr addObject:currentDict];

                }else{

                    // 如果不相同,说明 有新的一组,那么创建一个模型数组,并添加到组数组_groupArr

                    currentArr = [NSMutableArray array];

                    [currentArr addObject:currentDict];

                    [_groupArr addObject:currentArr];

                }

            }

        }

 // 3、遍历 对每一组 进行排序

        NSMutableArray *tempGroupArr = [NSMutableArray array];

        for (NSMutableArray *arr in _groupArr) {

            NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"FOrder" ascending:YES]];

            NSMutableArray *tempArr = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

                if([[obj1 objectForKey:@"FOrder"]intValue] < [[obj2 objectForKey:@"FOrder"]intValue]){

                    return NSOrderedAscending;

                }

                if([[obj1 objectForKey:@"FOrder"]intValue] > [[obj2 objectForKey:@"FOrder"]intValue]){

                    return NSOrderedDescending;

                }

                return NSOrderedSame;

            }];

            [tempGroupArr addObject:tempArr];

        }

        _groupArr = tempGroupArr;

         

        NSLog(@"封装好的group数组:%@",_groupArr);

    }

    return 0;

}

</foundation>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值