NSHashTable
类似于集合的集合,但具有更广泛的可用内存语义。继承自NSObject;NSHashTable具有以下特点:
- 它是内容可变的;
- 可以容纳对其成员的弱引用;
- 成员可以在输入上复制,也可以使用指针标识进行相等和散列;
- 可以包含任意指针(其成员不限于作为对象);
创建
// 根据选项创建哈希表
NSHashTable *hashTable = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsStrongMemory capacity:5];
NSPointerFunctions *functions = [[NSPointerFunctions alloc]initWithOptions:NSPointerFunctionsStrongMemory];
// 根据方法创建哈希表
NSHashTable *hashTable1 = [[NSHashTable alloc]initWithPointerFunctions:functions capacity:5];
// 创建存储弱引用内容的哈希表
NSHashTable *hashTable2 = [NSHashTable weakObjectsHashTable];
// 创建指定指针函数选项的哈希表
NSHashTable *hashTable3 = [NSHashTable hashTableWithOptions:NSPointerFunctionsStrongMemory];
访问内容
NSHashTable *hashTable = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsStrongMemory capacity:5];
[hashTable addObject:@"1"];
[hashTable addObject:@"2"];
[hashTable addObject:@"3"];
// 获取哈希表中的一个对象
NSString *anyObj = [hashTable anyObject];//1
// 获取哈希表中全部对象
NSArray *objArr = [hashTable allObjects];//(1,2,3)
// 包含哈希表元素的集合
NSSet *set = [hashTable setRepresentation];//{(1,3,2)}
// 获取哈希表中的元素数量
NSUInteger count = [hashTable count];//3
// 判断哈希表中是否包含指定元素
BOOL isCon = [hashTable containsObject:@"1"];//YES
// 确定哈希表是否包含给定对象,并返回该对象(如果存在)
NSString *obj = [hashTable member:@"1"];//1
// 根据枚举器遍历哈希表元素
NSEnumerator *enumerator = [hashTable objectEnumerator];
id object;
while (object = [enumerator nextObject]) {
NSLog(@"开始打印:%@\n",object);
/*
开始打印:1
开始打印:3
开始打印:2
*/
}
访问内容
NSHashTable *hashTable = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsStrongMemory capacity:5];
// 将指定对象添加到哈希表
[hashTable addObject:@"1"];
// 从哈希表中移除指定元素
[hashTable removeObject:@"1"];
// 从哈希表中删除所有元素
[hashTable removeAllObjects];
比较哈希表
NSHashTable *hashTable = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsStrongMemory capacity:5];
[hashTable addObject:@"1"];
[hashTable addObject:@"2"];
[hashTable addObject:@"3"];
[hashTable addObject:@"4"];
[hashTable addObject:@"5"];
NSHashTable *hashTable1 = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsStrongMemory capacity:5];
[hashTable1 addObject:@"3"];
[hashTable1 addObject:@"4"];
[hashTable1 addObject:@"5"];
[hashTable1 addObject:@"6"];
[hashTable1 addObject:@"7"];
// 给定的哈希表是否与接收哈希表相交
BOOL isIn = [hashTable intersectsHashTable:hashTable1];//YES
// 接收哈希表中的每个元素是否也存在于另一个给定哈希表中。
BOOL isSub = [hashTable isSubsetOfHashTable:hashTable1];//NO
// 指示给定的哈希表是否等于接收哈希表。
BOOL isEq = [hashTable isEqualToHashTable:hashTable1];//NO
// 从接收哈希表中删除另一个给定哈希表中的每个元素(如果存在)
[hashTable minusHashTable:hashTable1];//(1,2)
// 将另一个给定哈希表中的每个元素添加到接收哈希表(如果不存在)。
[hashTable unionHashTable:hashTable1];//(1,6,2,5,7,3,4)
// 从接收哈希表中删除不是另一个给定哈希表的成员的每个元素。
[hashTable intersectHashTable:hashTable1];//(6,5,7,3,4)