0

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

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

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

HASH value => 给出哈希表中指针数组的索引,并且每个指针都指向一个数组(或某个集合),该数组(或某个集合)包含具有该哈希的对象(因为它迭代它以检测哪个对象是成员)...这是一个相当常见的数据结构...

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

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

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

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

但这使用了枚举并且没有它需要的那么快(真正的快)

有没有办法或者我应该从头开始创建一个哈希表?(或使用核心基础)

感谢和抱歉给您带来的麻烦!

4

2 回答 2

1

从 iOS 6.0 和 MacOS 10.5 开始,您现在可以使用一个实际的 NSHashTable 对象。它以 NSSet 为模型,但它是自己的东西。 这里还有一些关于 Hash Tables 的 Apple 文档

于 2013-03-25T04:53:27.507 回答
1

如果你想要一个数组中的对象,只需调用 -allObjects,如果你想要所有哈希,那么你将不得不遍历它们,因为它们是 long 并且不能直接存储在 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;}

@结尾

例子:

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

于 2013-03-25T05:11:17.210 回答