#cocoa #core-data #data-structures
#какао #основные данные #структуры данных
Вопрос:
Есть ли в Objective-C какой-либо аналог TreeSet или TreeDictionary в Java. По сути, либо структура данных набора, либо словаря, которая реализована с помощью дерева (отсортированного), либо хэш-таблицы (не отсортированной).
Спасибо!
Комментарии:
1. Почему вы хотите использовать TreeSet / TreeDictionary, когда время поиска
O(logN)
отличаетсяO(1)
от времени хэш-таблицы?2. Потому что контейнер на основе дерева перечисляет свои элементы в определенном порядке, а контейнер на основе хэша перечисляет свои элементы в случайном порядке.
3. Как я подразумевал в сообщении, мне нужны отсортированные данные.
4. Вы могли бы просто отсортировать
allValues
массив.
Ответ №1:
Начиная с OS X 10.7 и iOS 5.0, вы можете использовать NSOrderedSet
. Однако нет NSOrderedDictionary
.
NSOrderedSet
упорядочивает элементы в соответствии с тем, куда вы их вставляете, а не в соответствии с функцией сравнения. Вы можете эффективно поддерживать порядок сортировки, используя indexOfObject:inSortedRange:options:usingComparator:
для поиска индекса, по которому нужно вставить новый объект, с NSBinarySearchingInsertionIndex
опцией.
Обратите внимание также, что, хотя NSOrderedSet
он понимает многие из тех же сообщений, что и оба NSSet
и NSArray
, он не является подклассом ни того, ни другого.
Комментарии:
1. На практике упорядоченный словарь очень легко реализовать,
NSOrderedSet
используя объекты-оболочки для значений.
Ответ №2:
Высокоуровневая базовая платформа iOS не имеет коллекции древовидного типа, но она есть в CoreFoundation — CFTree. В Foundation нет аналога с бесплатным мостом с хорошим объектно-ориентированным API, но это лучше, чем ничего.