这实际上是我一直试图解决的问题......
我需要在NSSet中实现这个功能......
我知道散列表和集合是如何工作的...... NSSet似乎使用HASH作为该数组的索引来存储指向散列表内对象的指针...当多个对象落入该散列时...它使用isEqual来检测哪个对象是我们搜索的成员......这意味着......
HASH值=>给出散列表中指针数组的索引,这些指针中的每一个都指向一个数组(或某个集合),该数组保存带有该散列的对象(因为它迭代它以检测哪个对象是成员)。 ..这是一个相当常见的数据结构...
我的问题是......有没有办法检索哈希表所指向的对象数组...我需要所有在NSSet中具有相同哈希值的对象......
我需要这个以便快速处理点之间的接近...
有办法吗?我知道我可以使用
的谓词[NSPredicate predicateWithFormat:@"hash == %u",hash];
但是这使用了一个枚举,并没有它所需要的那么快(真正快速)
有没有办法或者我应该从头开始创建HASH TABLE? (或使用核心基础)
谢谢,抱歉这个麻烦!
答案 0 :(得分:1)
从iOS 6.0和MacOS 10.5开始,您现在可以使用an actual NSHashTable object了。它以NSSet为模型,但它是自己的东西。 Here's some additional Apple documentation on Hash Tables,也是。
答案 1 :(得分:1)
如果你想让数组中的对象只调用-allObjects,如果你想要所有的哈希值,那么你将不得不遍历它们,因为它们很长并且不能直接存储在NSArray中。
我有一个想法是创建一个覆盖它自己的哈希的模拟对象,然后你可以在数组中搜索这个假装成你对象的对象的索引。
@interface MockHasher : NSObject{
NSUInteger mockHash;
}
@property(assign,nonatomic,getter = hash,setter = setHash:)NSUInteger mockHash;
@end
@implementation MockHasher
@synthesize mockHash;
-(BOOL)isEqual:(id)object{return YES;}
-(BOOL)isEqualTo:(id)object{return YES;}
@end
示例:
NSSet * myset = [NSSet setWithObject:@(1)];
MockHasher * mockObject = [[MockHasher new] autorelease];
mockObject.hash = @(1).hash;
NSArray * allObjects = [myset allObjects];
NSUInteger i = [allObjects indexOfObject:mockObject];
id result = [allObjects objectAtIndex:i];
NSLog(@"result = %@",result);
它很脆弱,因为它取决于数组要求传递给isEqual:
的对象而不是询问迭代对象......我不知道这是多么可靠......但它在我的测试中工作。