02-数组与集合之间的互相转换
2015-07-18 21:45
429 查看
首先引用一段有关两者的说明,NSSet和NSArray功能性质一样,用于存储对象,属于集合; NSSet,NSMutableSet类声明编程借口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;
NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高。比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要遍历整个数组,显然效率较低了;
1.NSArray 转换成 NSSet
2.NSSet 转换成 NSArray
3.NSArray转换成NSSet后再转换成有序NSArray(作用是消除重复值)
在这里补充有关数组排序的相关知识:
1.使用sortedArrayUsingSelector
2.使用block方式排序
3.使用NSSortDescriptor给数组排序
NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高。比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要遍历整个数组,显然效率较低了;
1.NSArray 转换成 NSSet
NSArray * array = @[@"2",@"3",@"2",@"1",@"4"]; NSMutableSet * muSet1 = [NSMutableSet setWithArray:array]; NSLog(@"muSet1 %@",muSet1);
2.NSSet 转换成 NSArray
NSSet *set = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", nil]; NSArray *arr1 = [set allObjects];//这是无序的 NSLog(@"arr1:%@",arr1);
3.NSArray转换成NSSet后再转换成有序NSArray(作用是消除重复值)
NSSet *myset = [NSSet setWithArray:array]; NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]];//升序 NSArray *sortArray = [myset sortedArrayUsingDescriptors:sortDesc]; NSLog(@"set %@\nsort %@", myset, sortArray);
在这里补充有关数组排序的相关知识:
1.使用sortedArrayUsingSelector
NSArray * array1 = @[@"b",@"d",@"a",@"c"]; NSLog(@"排序前 array1 %@",array1); array1 = [array1 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"排序后 array1 %@",array1);
2.使用block方式排序
NSArray * array2 = @[@"z",@"x",@"b",@"y",@"a"]; NSLog(@"array2 排序前 %@",array2); array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { //obj1 compare obj2 升序 //obj2 compare obj1 倒序 return [obj1 compare:obj2]; }]; NSLog(@"array2 排序后 %@",array2);
3.使用NSSortDescriptor给数组排序
Person * p1 = [[Person alloc] initWithName:@"zhang" andAge:20 andYear:@"1990"]; Person * p2 = [[Person alloc] initWithName:@"li" andAge:18 andYear:@"2990"]; Person * p3 = [[Person alloc] initWithName:@"wang" andAge:25 andYear:@"1890"]; NSArray * array3 = @[p1,p2,p3]; NSLog(@"array3 排序前 %@",array3); //如果你向给你自己定义的对象排序,必须根据某一个属性来排序, //sortDescriptorWithKey 参数要的就是你对象中,要依据哪个属性来排序,你就把哪个属性的名字当成key传入 //ascending YES表示升序 NO表示倒序 NSSortDescriptor * d1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO]; NSSortDescriptor * d2 = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:NO]; //如果你要使用多个属性进行排序,默认在前面的NSSortDescriptor优先级比较高 NSArray * descripts = @[d2,d1]; array3 = [array3 sortedArrayUsingDescriptors:descripts]; NSLog(@"array 3 排序后 %@",array3);
相关文章推荐
- 排序算法之归并排序
- ZOJ 1940 Dungeon Master
- 【C语言】使用递归的整数输出(高位到低位)/输出一个菱形(能够确定行数)
- boost之variant使用
- JavaScript匿名函数与闭包
- Myeclipse验证js语法报错
- 广义线性回归拟合教程和源码
- 德国精品软件推荐 压缩软件 WINRAR 个人版终于免费了。
- ScrollView
- ZOJ 1003 Crashing Balloon
- html5消除方块游戏总结-对象
- 《机器学习实战》课程笔记(第2章) k-近邻算法
- wpf 中的Canvas与Inkcanvas的属性说明
- BestCoder Round #48
- hdoj 3836 Equivalent Sets 【tarjan 求SCC + 缩点】
- 2015.7个人反思小结以及后续规划
- AYIT暑假集训大一第一周周六赛 F - 全减为1的次数
- Jar mismatch! Fix your dependencies
- POJ 3740 Easy Finding
- 剑指off-反转链表