0

これは実際に私が解決しようとしていた質問です...

この機能をNSSetに実装する必要があります...

ハッシュテーブルとセットがどのように機能するかを知っています。NSSetは、HASHをその配列のインデックスとして使用して、ハッシュテーブル内のオブジェクトへのポインタを格納しているようです...複数のオブジェクトがそのハッシュに含まれる場合..isEqualを使用しますオブジェクトのどれが検索するメンバーであるかを検出するために...つまり...

HASH value =>は、ハッシュテーブル内のポインターの配列のインデックスを示し、それらのポインターのそれぞれは、そのハッシュを持つオブジェクトを保持する配列(またはコレクション)を指します(オブジェクトを反復処理して、どのオブジェクトがメンバー)...これはかなり一般的なデータ構造です...

私の質問は...ハッシュテーブルによってポイントされているオブジェクトの配列を取得する方法はありますか...NSSet内に同じハッシュ値を持つすべてのオブジェクトが必要です...

ポイント間の近接をすばやく処理するためにこれが必要です...

方法はありますか?私は私が使用して述語を使用できることを知っています

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

ただし、これは列挙型を使用するため、必要な速度ではありません(実際に高速)

ハッシュテーブルを最初から作成する方法はありますか、それともすべきですか?(またはコアファンデーションを使用)

お手数をおかけしますが、よろしくお願いいたします。

4

2 に答える 2

1

iOS6.0およびMacOS10.5では、実際に使用できるNSHashTableオブジェクトが用意されています。NSSetをモデルにしていますが、それは独自のものです。 ハッシュテーブルに関する追加のAppleドキュメントもいくつかあります。

于 2013-03-25T04:53:27.507 に答える
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;}

@終わり

例:

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 に答える