可可中的HashTables

时间:2009-01-23 20:09:25

标签: objective-c cocoa macos hashtable

HashTables / HashMaps是现有数据结构中最常用的(如果不是 )之一。因此,在开始学习Cocoa编程时我研究的第一件事就是如何从哈希表中创建,填充和读取数据。

令我惊讶的是:我在Cocoa / Objective-C编程上阅读的所有文档似乎都没有解释这么多。作为一个使用“java.util”的Java开发人员,好像它是一个身体功能:我完全被这个困惑了。

所以,如果有人可以为我提供创建,填充和阅读哈希表内容的入门知识:我将非常感激。

5 个答案:

答案 0 :(得分:58)

NSDictionaryNSMutableDictionary

这是一个简单的例子:

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

答案 1 :(得分:12)

您可以尝试使用NSHashTable

答案 2 :(得分:8)

如果您正在使用Leopard(以及Cocoa的新垃圾收集),您还需要查看NSMapTable

答案 3 :(得分:7)

除了NSDictionary之外,还要检查NSSet,了解何时需要没有订单且没有重复的集合。

答案 4 :(得分:2)

使用iOS 6.0+ SDK中的NSHashTable。 哈希表是在NSSet之后建模的,具有以下差异: 它可以容纳对其成员的弱引用。 其成员可以在输入上复制,也可以使用指针标识进行相等和散列。 它可以包含任意指针(其成员不限于对象)。

 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为模型,具有以下差异: 键和/或值可选地保持“弱”,以便在回收其中一个对象时移除条目。 其键或值可以在输入上复制,也可以使用指针标识进行相等和散列。 它可以包含任意指针(其内容不限于对象)。

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