web-dev-qa-db-ja.com

Cocoaのハッシュテーブル

HashTables/HashMapsは、存在するデータ構造の中で最も有用なもの(そうでない場合はthe most)の1つです。そのため、Cocoaでプログラミングを学び始めるときに最初に調査したことの1つは、ハッシュテーブルからデータを作成、入力、および読み取る方法でした。

驚いたことに、私がCocoa/Objective-Cプログラミングで読んだすべてのドキュメントは、これについてあまり説明していないようです。 Java "Java.util"を使用する開発者は、あたかも身体の機能であるかのように:これにはまったく困惑しています。

したがって、誰かがハッシュテーブルのコンテンツを作成、入力、および読み取るための入門書を私に提供できたら、私はそれを大いに感謝します。

28
Ryan Delucchi

NSDictionary および NSMutableDictionary

そして、ここに簡単な例があります:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:anObj forKey:@"foo"];
[dictionary objectForKey:@"foo"];
[dictionary removeObjectForKey:@"foo"];
[dictionary release];
58
Martin Gordon

NSHashTable を使用してみてください。

12
Julius Guzy

Leopard(およびCocoaの新しいガベージコレクション)を使用している場合は、 NSMapTable も確認してください。

8
Barry Wark

NSDictionaryに加えて、順序や重複のないコレクションが必要な場合は、NSSetもチェックしてください。

7
Chris Hanson

IOS 6.0以降のSDKの NSHashTable を使用します。ハッシュテーブルはNSSetに基づいてモデル化されていますが、次の違いがあります。メンバーへの弱い参照を保持できます。そのメンバーは入力時にコピーされるか、同等性とハッシュのためにポインターIDを使用します。任意のポインターを含めることができます(そのメンバーはオブジェクトであることに制限されません)。

 NSHashTable *hashTable = [NSHashTable 
 hashTableWithOptions:NSPointerFunctionsCopyIn];
 [hashTable addObject:@"foo"];
 [hashTable addObject:@"bar"];
 [hashTable addObject:@100];
 [hashTable removeObject:@"bar"];
 NSLog(@"Members: %@", [hashTable allObjects]);

IOS 6.0以降のSDKの NSMapTable を使用します。マップテーブルは、NSDictionaryに基づいてモデル化されていますが、次の違いがあります。キーまたは値、あるいはその両方がオプションで「弱く」保持され、オブジェクトの1つが再利用されるときにエントリが削除されます。そのキーまたは値は、入力時にコピーされるか、同等性とハッシュのためにポインターIDを使用します。任意のポインターを含めることができます(その内容はオブジェクトであることに限定されません)。

 id delegate = ...;
 NSMapTable *mapTable = [NSMapTable 
 mapTableWithKeyOptions:NSMapTableStrongMemory
                                         valueOptions:NSMapTableWeakMemory];
 [mapTable setObject:delegate forKey:@"foo"];
 NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);
2
mylittleswift