数组和字典
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>
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>
相关文章推荐
- 4.OC数组和字典
- Android系统信息获取
- tomcat启动Error ListenerStart解决办法
- 使用AFNetworking请求数据成功后走了两遍success的原因
- linux 编译hadoop 源码
- java.lang.NoSuchFieldError: VERSION_2_3_0
- 【慕课笔记】第四章 JAVA中的集合框架(上) 第7节 学生选课—课程修改
- 私钥签名解密公钥加密验签代码
- JS实现输入框只能输入数字
- 函数
- 计算机网络原理笔记(五、运输层)
- phpMyAdmin:“您应升级到 MySQL 5.5.0 或更高版本”和“PHP 5.5+ is required”的解决方法
- VB 动态填充 Excel表格
- 朴素贝叶斯分类算法
- 2014 非常好用的开源 Android 测试工具
- Android安全攻防战,反编译与混淆技术完全解析(上)
- JAVA基础(18) Java 多线程 并发编程
- [转][ASP.NET]ASP.NET 预编译网站
- Linux笔记(17)——VIM编辑器
- HTTP status Code 412 未满足前提条件的解决方法之一