您的位置:首页 > 其它

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

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