您的位置:首页 > 其它

数组和字典

2016-02-23 14:37 204 查看
一、数组和数组排序

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组和字典