2013-03-25 3 views
0

это на самом деле вопрос, который я бы пытался решить ...Начало набора объектов из NSSet с помощью HASH

мне нужно реализовать эту функциональность в NSSet ...

Я знаю, как хэш-таблицы и наборы работает .. и NSSet, похоже, сохраняет указатель на объекты внутри хеш-таблицы, используя HASH в качестве индекса этого массива ... когда в этот хэш попадает более одного объекта .. он использует isEqual для определения того, один из объектов - элемент, который мы ищем ... это означает ...

Значение HASH => указывает индекс массива указателей в хеш-таблице, а каждый из t указатели шлангов указывают на массив (или некоторую коллекцию), который содержит объекты с этим хешем (поскольку он выполняет итерацию по нему, чтобы определить, какой объект является членом) ... это довольно общая структура данных ...

My вопрос есть ... есть способ получить массив объектов, на которые указывает хэш-таблица ... Мне нужно ВСЕ объекты, которые имеют ОДНОВРЕМЕННУЮ СТОИМОСТЬ HASH внутри NSSet ...

Мне это нужно чтобы быстро обработать близость между точками ...

Есть ли способ? я знаю, что я могу использовать предикат, используя

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

но использует перечисление и не так быстро, как это должно быть (очень быстро)

Есть ли способ, или я должен создать хэш-таблицу из царапина? (или использовать фундамент основания)

Спасибо и извините за беспокойство!

ответ

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:, а не просить итерированный объект ... Я не знаю, насколько это достоверно ... но он работал в моем тесте.

+0

, если он правильно реализован, каждый хэш должен быть уникальным, если это значение, и как таковое должно быть добавлено только в набор после –

+0

, то, что я пытаюсь моделировать здесь, является «ХАШ» «ХАШ» (как указано в документах CFSet), где вы можете получить все значения, которые имеют тот же хеш в операции.как ... ([Set getWithHash: hash]) ... я могу получить это с предикатом, но производительность меня раздражает –

+0

сохраните их в качестве словаря с хешем в качестве ключа .. или используйте NSHashTable или сверните свой собственный ... NSHashTable, вероятно, не то, что вы хотите ... словарь будет навязывать перезаписываемое поведение, если ваш хеш-файл не подходит, вы можете перезаписать объекты разными значениями. –

1

Начиная с iOS 6.0 и MacOS 10.5, у вас есть an actual NSHashTable object для работы. Его смоделировали после NSSet, но вместо этого это его собственная вещь. Here's some additional Apple documentation on Hash Tables, также.

+0

Я новичок в этом ... я думал, может быть, функции указателей дадут мне массив указателей на объекты с одинаковым хэшем? –

+0

при дальнейшей проверке кажется, что функции указателя не позволят мне получить доступ к массиву в хэш-индексе хэш-таблицы ... может быть, решение состоит в том, чтобы реализовать собственный стиль c style hash самостоятельно –