NSSet按Hash算法來存儲集合中的元素松邪,因此具有很好的存取和查找性能
NSSet不保證元素的添加順序腔呜,順序有可能發(fā)生變化友存。與NSArray相比最大去唄是元素沒有索引
元素不可重復(fù)
setByAddingObject:添加新元素瘟裸,返回添加元素后的新集合
setByAddingObjectsFromSet:NSSet集合添加多個新元素,返回新集合
allObjects:返回該集合中所有元素組成的NSArray
anyObject:返回某個元素 返回的元素不確定丘喻,但也不保證隨機(jī)返回集合元素
只要一個NSSet沒有發(fā)生改變脯宿,無論多少次調(diào)用該方法,返回的總是同一個幾何元素
containsObject:判斷集合是否包含指定元素
meeber:判斷該集合是否包含于該參數(shù)相等的元素泉粉,包含:返回相等元素连霉,否則返回Nil
objectsPassingTest:額外傳入一個NSEnumerationOptions:迭代選項參數(shù)
NSArray也提供類似的indexesOfObjectsPassingTest: indexesOfObjectsWithOptions:passingTest
he indexesOfObjectsAtIndexes:options:passingTest: 對NSArrary集合元素進(jìn)行過濾,只是這些方法返回符合條件的幾何元素的索引組成的NSIndexSet集合
isSubsetOfSet:判斷當(dāng)前NSSet集合是否為另一個集合的子集合嗡靡。調(diào)用該方法需要傳入另一個集合跺撼。
intersectsSet:判斷兩級和有無交集
isEqualToset:兩集合是否相等
NSSet * set1=[NSSet setWithObjects:
@"雅典娜",
@"阿芙羅狄忒",
@"戴安娜",
@"雅典娜",
nil];
NSSet* set2=[NSSet setWithObjects:
@"雅典娜",
@"玉皇大帝",
@"太白金星",nil];
//如果有重復(fù)的元素,NSSet 只會保留一個 完美的去重復(fù)方案
set1=[set1 setByAddingObject:@"奧克修斯"];
NSSet* s=[set1 setByAddingObjectsFromSet:set2];
BOOL b=[set1 intersectsSet:set2];//計算兩個NSSet集合是否有交集
BOOL bo=[set2 isSubsetOfSet:set1];//判斷set2是否是set1的子集
BOOL bb=[set1 containsObject:@"亞瑟"];
//將取出相同的元素讨彼,單曲出那個元素是不確定的
NSLog(@"set1取出一個元素:%@",[set1 anyObject]);
NSLog(@"set1取出一個元素:%@",[set1 anyObject]);
NSSet* fileteredSet=[set1 objectsPassingTest:^BOOL(id? _Nonnull obj, BOOL * _Nonnull stop) {
return (BOOL)([obj length]>0);
}];
NSLog(@"set1中元素的長度大于8的幾何元素有:%@", [NScollectionToString collectionToString:fileteredSet]);
7.6.2 NSSet判斷幾何元素重復(fù)的標(biāo)準(zhǔn)
簡單來說:
1.兩個對象的isEqual:方法返回YES
2.兩個對象的hash方法返回值也相等
- (BOOL)isEqual:(id)other
{
//? ? if (other == self) {//NSObject默認(rèn)設(shè)定
//? ? ? ? return YES;
//? ? } else if (![super isEqual:other]) {
//? ? ? ? return NO;
//? ? } else {
//? ? ? ? return <#comparison expression#>;
//? ? }
NSString* name=[NSString stringWithFormat:
[other name]];
NSString* pass=[NSString stringWithFormat:
[other pass]];
if ([self.name isEqualToString:name] && [self.pass isEqualToString:pass] ) {
return YES;
}else
return NO;
}
- (NSUInteger)hash
{
NSInteger namehash=name ==nil? 0:[name hash];
NSInteger passhash=pass ==nil? 0:[pass hash];
return namehash*31+passhash;
}
7.6.3 NSMutableSet的功能與用法
NSMutableSet 繼承了NSSet 可以動態(tài)添加幾何元素 故 可以創(chuàng)建nSSet集合時指定底層Hash表的初始容量
特色: 除了增刪 外歉井,加入計算交集 并集 差集的方法
addObjectsFromArray:
addObjects
unionSet: 并集
minusSet:差集
intersectSet:交集
setSet:用后一個集合的元素替換已有集合中所有的元素
NSMutableSet* set=[NSMutableSet setWithArray:
array];//使用數(shù)組初始化
[set removeObject:@"武松"];
[set intersectSet:set1];//計算交集,結(jié)果給set
[set unionSet:set1];//并集哈误,結(jié)果給set
[set minusSet:set1];//差集哩至,結(jié)果給set
[set setSet:set1];//將set1給set
7.6.4NSCountedSet的功能和用法
為NSMutableSet子類
不同:NSCountedSet為每個元素額外維護(hù)一個添加次數(shù)的狀態(tài)躏嚎,當(dāng)添加一個元素時,如果NSCountedSet集合中不包含鈣元素菩貌,NSCountedSet整整接納鈣元素卢佣,并將鈣元素的添加次數(shù)標(biāo)注為1:當(dāng)程序向NSCountedSet中添加一個元素,如果已經(jīng)包含箭阶,NSCountedSet不會接納珠漂,但會將鈣元素的添加次數(shù)+1
刪除元素時,次數(shù)-1尾膊,為零時,才會被真正刪除
使用如下方法返回某個元素的添加次數(shù):
countForObject:
NSCountedSet* countedSet=[NSCountedSet setWithObjects:
@"iOS",@"IOS",@"iOS", nil];
[countedSet addObject:@"java"];
NSLog(@"%lu",[countedSet countForObject:@"iOS"]);
[countedSet removeObject:@"iOS"];
NSLog(@"%@",[NScollectionToString collectionToString:countedSet]);
[countedSet removeObject:@"iOS"];
NSLog(@"%@",[NScollectionToString collectionToString:countedSet]);//不在顯示iOS
7.7有序集合(NSOrderedSet與NSMutableOrderedSet)
元素不可重復(fù)荞彼,但會增加添加次數(shù)冈敛,并且有下標(biāo)索引
NSOrderedSet 不允許元素重復(fù),可以保持元素的添加順序鸣皂,每個元素都有索引
NSMutableOrderedSet 也提供交集 并集差集等功能