《黑马程序员》 NSSet类型 以及与NSArray区别(Objective - c语法)
NSSet类型 以及与NSArray区别
NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;
NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高,主要是它用到了一个算法hash(散列,也可直译为哈希);开发文档中这样解释:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.
比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了;
NSSet,NSArray都是类,只能添加cocoa对象,如果需要加入基本数据类型(int,float,BOOL,double等),需要将数据封装成NSNumber类型。
例:
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //集合的特点 //1.集合是无序的 //2.集合中的元素都是互异的,不可以重复,如果有重复的元素,则识别为一个元素 //1.创建一个NSSet对象 NSSet *set = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", @"aa", nil]; NSLog(@"set: %@", set); //2.求集合元素个数 NSUInteger count = [set count]; NSLog(@"count = %lu", count); //3.获得集合的元素 //(1)获得全部元素 NSArray *members = [set allObjects]; NSLog(@"%@", members); //(2)获得单一元素 //anyObject随意取一个元素 NSString *str1 = [set anyObject]; NSString *str2 = [set anyObject]; NSString *str3 = [set anyObject]; NSString *str4 = [set anyObject]; NSLog(@"str = %@,%@,%@,%@", str1, str2, str3, str4); //4.判断集合中是否包含某个对象。 BOOL have = [set containsObject:@"cc"]; NSLog(@"have = %d", have); //NSMutableSet //1.创建一个NSMutableSet对象 NSMutableSet *mSet = [[NSMutableSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"cc", @"dd", nil]; //2.添加@"ff"到mSet集合中 [mSet addObject:@"ff"]; NSLog(@"mSet = %@", mSet); //3.移除掉@"cc" [mSet removeObject:@"cc"]; NSLog(@"remove:%@", mSet); //NSCountedSet NSCountedSet *cSet = [[NSCountedSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"cc", @"dd", @"cc", @"dd", nil]; NSLog(@"cSet:%@", cSet); //移除@"cc", //removeObject: 对于NSCountedSet对象而言,移除只能移除一个对象,而对于NSMutableSet而言,移除会将所有相同的对象全部移除。 [cSet removeObject:@"cc"]; NSLog(@"remove:%@", cSet); //添加@"ff" //addObject:对于NSCountedSet对象而言,添加对象会增加对象在集合中出现的次数,而对于NSMutableSet而言,如果添加的对象已经存在于集合中,则不会再添加。 [cSet addObject:@"ff"]; [cSet addObject:@"dd"]; NSLog(@"add:%@", cSet); //获得某个对象在集合中出现的次数 NSUInteger countInSet = [cSet countForObject:@"dd"]; NSLog(@"count = %lu", countInSet); //快速遍历(快速枚举) for (NSString *element in mSet) { NSLog(@"%@", element); } } return 0; }