引用自:http://zhidao.baidu.com/link?url=uD25s5OdnfmnNzvEUcYl3eCuSNE20BytMTgTQ_L42YM3B0DWWCR3Fj3gBStI09GKBwJT1obbGSnPWgwDlr-7X1qByLjjn8VORAjMygfxJZ3
http://blog.csdn.net/ms2146/article/details/8657011
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 {
- NSSet *set1 = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
- NSSet *set2 = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", nil];
- NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
- NSSet *set3 = [NSSet setWithArray:array];
- NSLog(@"set1 :%@", set1);
- NSLog(@"set2 :%@", set2);
- NSLog(@"set3 :%@", set3);
- //获取集合个数
- NSLog(@"set1 count :%d", set1.count);
- //以数组的形式获取集合中的所有对象
- NSArray *allObj = [set2 allObjects];
- NSLog(@"allObj :%@", allObj);
- //获取任意一对象
- NSLog(@"anyObj :%@", [set3 anyObject]);
- //是否包含某个对象
- NSLog(@"contains :%d", [set3 containsObject:@"obj2"]);
- //是否包含指定set中的对象
- NSLog(@"intersect obj :%d", [set1 intersectsSet:set3]);
- //是否完全匹配
- NSLog(@"isEqual :%d", [set2 isEqualToSet:set3]);
- //是否是子集合
- NSLog(@"isSubSet :%d", [set3 isSubsetOfSet:set1]);
- NSSet *set4 = [NSSet setWithObjects:@"a", @"b", nil];
- NSArray *ary = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil];
- NSSet *set5 = [set4 setByAddingObjectsFromArray:ary];
- NSLog(@"addFromArray :%@", set5);
- NSMutableSet *mutableSet1 = [NSMutableSet setWithObjects:@"1", @"2", @"3", nil];
- NSMutableSet *mutableSet2 = [NSMutableSet setWithObjects:@"a", @"2", @"b", nil];
- NSMutableSet *mutableSet3 = [NSMutableSet setWithObjects:@"1", @"c", @"b", nil];
- //集合元素相减
- [mutableSet1 minusSet:mutableSet2];
- NSLog(@"minus :%@", mutableSet1);
- //只留下相等元素
- [mutableSet1 intersectSet:mutableSet3];
- NSLog(@"intersect :%@", mutableSet1);
- //合并集合
- [mutableSet2 unionSet:mutableSet3];
- NSLog(@"union :%@", mutableSet2);
- //删除指定元素
- [mutableSet2 removeObject:@"a"];
- NSLog(@"removeObj :%@", mutableSet2);
- //删除所有数据
- [mutableSet2 removeAllObjects];
- NSLog(@"removeAll :%@", mutableSet2);
- }
- return 0;
- }
日志:
- set1 :{(
- d,
- b,
- c,
- a
- )}
- set2 :{(
- 1,
- 2,
- 3
- )}
- set3 :{(
- a,
- b,
- c
- )}
- set1 count :4
- allObj :(
- 1,
- 2,
- 3
- )
- anyObj :a
- contains :0
- intersect obj :1
- isEqual :0
- isSubSet :1
- addFromArray :{(
- 3,
- b,
- 1,
- 4,
- 2,
- a
- )}
- minus :{(
- 1,
- 3
- )}
- intersect :{(
- 1
- )}
- union :{(
- b,
- 1,
- 2,
- a,
- c
- )}
- removeObj :{(
- b,
- 1,
- 2,
- c
- )}
- removeAll :{(
- )}