NSSet集合对象是用来干什么的呢,在之前做项目中很少用,但并不是代表不好用,在追求效率优化方面NSSet要比NSArray要高的多,比如在苹果端查找数据库中的数据NSSet要比NSArray要快的多。学习了NSSet可能会发现项目中有些情况可以优化,尤其是数组遍历,判断唯一性,还有其他
集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。
集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。
- 存储的所有对象只能有唯一一个,不能重复。
NSSet介绍
NSArray *array = [[NSArray alloc] initWithObjects:@"abc",@"def", @"ghw",nil];
NSSet *set1 = [NSSet setWithArray:array];
NSLog(@"%@", set1);
NSLog(@"%@",[set1 allObjects]);
打印结果:
2018-03-14 11:27:19.262887+0800 test[9761:369467] {(
abc,
def,
ghw
)}
2018-03-14 11:27:19.263065+0800 test[9761:369467] (
abc,
def,
ghw
)
//两种不同的创建集合的方法
NSSet *set2 = [[NSSet alloc]initWithObjects:@"sex",@"age",@"create",@"name",@"first",nil];
NSSet *set3 = [NSSet setWithObjects:@"sex",@"age",@"create",@"name",@"last",@"first",nil];
NSString *setString = [set2 anyObject];
NSLog(@"setString %@",setString);
NSLog(@"set2 %@",set2);
NSLog(@"set3 %@",set3);
NSLog(@"set2 count:%lu", [set2 count]);
运行结果:
2018-03-14 11:27:19.263101+0800 test[9761:369467] setString age
2018-03-14 11:27:19.263134+0800 test[9761:369467] set2 {(
age,
sex,
first,
name,
create
)}
2018-03-14 11:27:19.263147+0800 test[9761:369467] set3 {(
age,
sex,
first,
name,
last,
create
)}
2018-03-14 11:27:19.263154+0800 test[9761:369467] set2 count:5
//判断是否含有age字符串
if([set2 containsObject:@"age"]) {
NSLog(@"set2包含age");
}
//判断set2 是否等于set3
if ([set2 isEqualToSet:set3]) {
NSLog(@"set2 等于 set3");
}else{
NSLog(@"set2 不等于 set3");
}
//判断set2是否是否是set3的子集合
if ([set2 isSubsetOfSet:set3]) {
NSLog(@"set2 isSubsetOfSet set3");
}
//获取所有set2对象
NSArray *array2 = [set2 allObjects];
NSLog(@"array:%@", array2);
//迭代遍历
NSEnumerator *enumerator = [set2 objectEnumerator];
for (NSObject *object in enumerator) {
NSLog(@"set2里的对象:%@", object);
}
//遍历方法二
for (NSString *tring in set2) {
NSLog(@"tring set2里的对象:%@",tring);
}
运行结果:
2018-03-14 11:27:19.263173+0800 test[9761:369467] set2包含age
2018-03-14 11:27:19.263183+0800 test[9761:369467] set2 不等于 set3
2018-03-14 11:27:19.263192+0800 test[9761:369467] set2 isSubsetOfSet set3
2018-03-14 11:27:19.263270+0800 test[9761:369467] array:(
age,
sex,
first,
name,
create
)
2018-03-14 11:27:19.263316+0800 test[9761:369467] set2里的对象:age
2018-03-14 11:27:19.263327+0800 test[9761:369467] set2里的对象:sex
2018-03-14 11:27:19.263334+0800 test[9761:369467] set2里的对象:first
2018-03-14 11:27:19.263341+0800 test[9761:369467] set2里的对象:name
2018-03-14 11:27:19.263349+0800 test[9761:369467] set2里的对象:create
2018-03-14 11:27:19.263365+0800 test[9761:369467] tring set2里的对象:age
2018-03-14 11:27:19.263373+0800 test[9761:369467] tring set2里的对象:sex
2018-03-14 11:27:19.263380+0800 test[9761:369467] tring set2里的对象:first
2018-03-14 11:27:19.263388+0800 test[9761:369467] tring set2里的对象:name
2018-03-14 11:27:19.263396+0800 test[9761:369467] tring set2里的对象:create
NSMutableSet介绍
*NSMutableSet只做说明,不打印测试结果,因为NSMutableSet是不断变化的*
NSMutableSet *muSet = [NSMutableSet setWithCapacity:6];
[muSet addObject:@"name"];
NSSet *set4 = [NSSet setWithObjects:@"sex",@"first", @"last", nil];
//muSet不断的变化下面的情况单一测试 不做打印结果
//添加set数据 合并
[muSet unionSet:set4];
for (NSObject *object in muSet) {
NSLog(@"all nuSet:%@",object);
}
NSSet *set5 = [NSSet setWithObjects:@"sex",@"first", nil];
//在muSet中删除包含set1总数据
[muSet minusSet:set5];
for (NSObject *object in muSet) {
NSLog(@"after minusSet:%@",object);
}
//做交集
[muSet intersectSet:set5];
for (NSObject *object in muSet) {
NSLog(@"after intersectSet:%@",object);
}
//删除指定元素
[muSet removeObject:@"age"];
NSLog(@"removeObj :%@", muSet);
//删除所有元素
[muSet removeAllObjects];
NSLog(@"removeObj :%@", muSet);