HashTables в какао

HashTables/HashMaps — одна из самых (если не самая) полезных существующих структур данных. Таким образом, одной из первых вещей, которые я исследовал, когда начал изучать программирование в Cocoa, было то, как создавать, заполнять и читать данные из хеш-таблицы.

К моему удивлению: вся документация, которую я читал по программированию Cocoa/Objective-C, кажется, вообще ничего не объясняет. Как разработчик Java, который использует «java.util», как если бы это была телесная функция: я совершенно сбит с толку этим.

Итак, если бы кто-нибудь мог дать мне учебник для начинающих по созданию, заполнению и чтению содержимого хеш-таблицы: я был бы очень признателен.


person Ryan Delucchi    schedule 23.01.2009    source источник
comment
Технически язык Objective-C не имеет хеш-таблиц или каких-либо структур данных, кроме базовых C-массивов. Однако фреймворки Cocoa (в частности, Foundation) это делают.   -  person amrox    schedule 24.01.2009
comment
Спасибо что подметил это. Таким образом, я обновил заголовок моего вопроса, чтобы отразить это.   -  person Ryan Delucchi    schedule 24.01.2009
comment
Если вы посмотрите в /usr/include/objc, вы обнаружите, что Objective-C действительно имеет тип хеш-таблицы. (Возможно, он не указан в документации, но он есть в заголовках.)   -  person Peter Hosey    schedule 25.01.2009
comment
Все еще не является частью языка Objective-C.   -  person Niklas Berglund    schedule 13.10.2013


Ответы (5)


NSDictionary и NSMutableDictionary?

А вот простой пример:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:anObj forKey:@"foo"];
[dictionary objectForKey:@"foo"];
[dictionary removeObjectForKey:@"foo"];
[dictionary release];
person Martin Gordon    schedule 23.01.2009
comment
Обратите внимание, что в истинно объектно-ориентированном стиле классы Cocoa названы по тому, что они делают, а не по тому, как они реализованы, как HashTable, HashMap и их друзья в Java, C# и т. д. - person Chris Hanson; 24.01.2009
comment
C# также называет это словарем! - person bobobobo; 08.12.2009
comment
@Chris Hanson - в Java это часто отличает реализацию, например. Thread, из интерфейса, например. Runnable. Я считаю, что это соглашение способствует программированию интерфейсов. Это может быть или не быть «настоящей объектно-ориентированной модой», но многие считают ее хорошей идеей. - person CurtainDog; 08.06.2012
comment
@Chris Hanson - В Java это называется Map (что он делает), и существует несколько реализаций, таких как HashMap, TreeMap, LinkedHashMap. - person TJez; 13.11.2014

Вы можете попробовать использовать ссылку NSHashTable!

person Julius Guzy    schedule 08.07.2011
comment
NSHashTable - простой список значений и возможность поиска по ключу - это именно то, что я искал (для моего варианта использования), мне не нужен/не нужен дополнительный ключ/значение NSDictionary, я бы сохраняя одно и то же значение в ключе и значении или оставляя значение пустым, если это вообще возможно. Я просто хочу заполнить значения в NSHashTable, а затем использовать [myHashTable containsObject: [NSNumber numberWithInteger: searchValue]], чтобы увидеть, существует ли значение. - person Tim T; 24.03.2013
comment
Тим Т.: Я думаю, то, о чем вы говорите, называется NSArray. Вы добавляете значения в хеш-таблицу с помощью [array addObject:value], а затем проверяете, содержится ли она в [array containsObject:value]. Вы также можете использовать NSSet, если хотите, чтобы значения были уникальными. NSHashTable предназначен для случаев - конечно, полностью законных - когда вы хотите включить произвольные указатели на не-объекты и другие пограничные случаи, и изначально был добавлен, чтобы избежать сохранения памяти, которую другие коллекции вызывают для добавленных объектов, чтобы поддержать Cocoa's ill Судьбоносное предприятие по сбору мусора (сейчас удалено). - person SG1; 13.12.2013

Если вы используете Leopard (и новую коллекцию мусора Cocoa), вам также следует взглянуть на NSMapTable.

person Barry Wark    schedule 23.01.2009
comment
дополнительная информация о NSMapTable: stackoverflow.com/questions/6904533 / - person Steph Thirion; 30.08.2012

В дополнение к NSDictionary, также проверьте NSSet, когда вам нужна коллекция без порядка и без дубликатов.

person Chris Hanson    schedule 24.01.2009

Используйте 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]);
person mylittleswift    schedule 24.01.2018