【问题标题】:HashTables in Cocoa可可中的哈希表
【发布时间】:2010-10-03 05:23:39
【问题描述】:

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

令我惊讶的是:我一直在阅读的所有关于 Cocoa/Objective-C 编程的文档似乎根本没有解释这么多。作为一个使用“java.util”的Java开发人员,就好像它是一个身体功能一样:我对此感到非常困惑。

所以,如果有人可以为我提供创建、填充和读取哈希表内容的入门指南:我将不胜感激。

【问题讨论】:

  • 从技术上讲,Objective-C 语言没有散列表或基本 C 数组之外的任何类型的数据结构。但是 Cocoa 框架(尤其是 Foundation)可以。
  • 感谢您指出这一点。因此,我更新了我的问题的标题以反映这一点。
  • 如果您查看/usr/include/objc,您会发现Objective-C 实际上有一个哈希表类型。 (也许它没有在文档中列出,但它在标题中。)
  • 仍然不是 Objective-C 语言的一部分。

标签: objective-c cocoa macos hashtable


【解决方案1】:

如果您正在使用 Leopard(和 Cocoa 的新垃圾收集),您还想看看 NSMapTable

【讨论】:

【解决方案2】:

NSDictionaryNSMutableDictionary?

这是一个简单的例子:

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

【讨论】:

  • 请注意,在真正面向对象的方式中,Cocoa 类的命名是“它们做什么”而不是“它们是如何实现的”,因为 HashTable、HashMap 和朋友在 Java、C# ,等等。
  • C# 也称它为字典!
  • @Chris Hanson - 在 Java 中,这通常区分实现,例如Thread,来自接口,例如Runnable。我发现这个约定促进了对接口的编程。它可能是也可能不是“真正的面向对象的时尚”,但被广泛认为是一个好主意。
  • @Chris Hanson - 在 Java 中它被称为“映射”(它的作用),并且提供了多种实现,例如“HashMap”、“TreeMap”、“LinkedHashMap”。
【解决方案3】:

使用来自 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]);

【讨论】:

    【解决方案4】:

    您可以尝试使用NSHashTable

    【讨论】:

    • NSHashTable - 一个简单的值列表和按键查找的能力正是我想要的(对于我的用例),我不需要/想要额外的“key/ value”的 NSDictionary,我会在键和值中存储相同的值,或者如果可能的话,将值留空。我只想在 NSHashTable 中填充值,然后使用 [myHashTable containsObject:[NSNumber numberWithInteger:searchValue]] 查看该值是否存在。
    • Tim T - 我认为您所说的称为 NSArray。您使用 [array addObject:value] 将值添加到“哈希表”,然后检查它是否包含在 [array containsObject:value] 中。如果您希望值是唯一的,您也可以使用 NSSet。 NSHashTable 适用于某些情况——当然是完全合法的——您希望包含指向非对象和其他边缘情况的任意指针,最初添加它是为了避免其他集合调用添加的对象以支持的内存“保留” Cocoa 对垃圾收集的命运多舛的冒险(现已删除)。
    【解决方案5】:

    除了 NSDictionary 之外,还可以查看 NSSet 以了解何时需要没有顺序且没有重复的集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多