使用HASH从NSSet获取对象集

时间:2013-03-25 04:50:07

标签: objective-c

这实际上是我一直试图解决的问题......

我需要在NSSet中实现这个功能......

我知道散列表和集合是如何工作的...... NSSet似乎使用HASH作为该数组的索引来存储指向散列表内对象的指针...当多个对象落入该散列时...它使用isEqual来检测哪个对象是我们搜索的成员......这意味着......

HASH值=>给出散列表中指针数组的索引,这些指针中的每一个都指向一个数组(或某个集合),该数组保存带有该散列的对象(因为它迭代它以检测哪个对象是成员)。 ..这是一个相当常见的数据结构...

我的问题是......有没有办法检索哈希表所指向的对象数组...我需要所有在NSSet中具有相同哈希值的对象......

我需要这个以便快速处理点之间的接近...

有办法吗?我知道我可以使用

的谓词
[NSPredicate predicateWithFormat:@"hash == %u",hash];

但是这使用了一个枚举,并没有它所需要的那么快(真正快速)

有没有办法或者我应该从头开始创建HASH TABLE? (或使用核心基础)

谢谢,抱歉这个麻烦!

2 个答案:

答案 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:的对象而不是询问迭代对象......我不知道这是多么可靠......但它在我的测试中工作。