Хэш-таблицы в Cocoa
HashTables/HashMaps - одна из самых (если не самая) полезная из существующих структур данных. Таким образом, одна из первых вещей, которые я исследовала при запуске программирования в Cocoa, заключалась в том, как создавать, заполнять и читать данные из хэш-таблицы.
К моему удивлению, вся документация, которую я читал в программировании Cocoa/Objective-C, кажется, вообще не объясняет. Как разработчик Java, который использует "java.util", как если бы это была телесная функция: я совершенно озадачен этим.
Итак, если кто-то может предоставить мне учебник для создания, заполнения и чтения содержимого хеш-таблицы: я был бы очень признателен.
Ответы
Ответ 1
NSDictionary и NSMutableDictionary?
И вот простой пример:
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:anObj forKey:@"foo"];
[dictionary objectForKey:@"foo"];
[dictionary removeObjectForKey:@"foo"];
[dictionary release];
Ответ 2
Вы можете попробовать использовать NSHashTable!
Ответ 3
Если вы используете Leopard (и новую сборку мусора в Cocoa), вам также стоит взглянуть на NSMapTable.
Ответ 4
В дополнение к NSDictionary, также проверьте NSSet, когда вам нужна коллекция без заказа и дубликатов.
Ответ 5
Используйте NSHashTable из iOS 6. 0+ SDK.
Хеш-таблица моделируется после NSSet со следующими отличиями:
Он может содержать слабые ссылки на своих членов.
Его члены могут быть скопированы на входе или могут использовать идентичность указателя для равенства и хеширования.
Он может содержать произвольные указатели (его члены не обязательно должны быть объектами).
NSHashTable *hashTable = [NSHashTable
hashTableWithOptions:NSPointerFunctionsCopyIn];
[hashTable addObject:@"foo"];
[hashTable addObject:@"bar"];
[hashTable addObject:@100];
[hashTable removeObject:@"bar"];
NSLog(@"Members: %@", [hashTable allObjects]);
Используйте NSMapTable из iOS 6. 0+ SDK.
Таблица карты смоделирована после NSDictionary со следующими отличиями:
Ключи и/или значения необязательно удерживаются "слабо", так что записи удаляются, когда один из объектов восстанавливается.
Его ключи или значения могут быть скопированы на входе или могут использовать идентичность указателя для равенства и хеширования.
Он может содержать произвольные указатели (его содержимое не обязательно должно быть объектом).
id delegate = ...;
NSMapTable *mapTable = [NSMapTable
mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableWeakMemory];
[mapTable setObject:delegate forKey:@"foo"];
NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);