Я использую TreeMap
в Java-коде, который будет перенесен в ios (цель-c). Он должен быть таким же эффективным, как java original (для получения .subMap()
как минимум). Для этого существует какой-либо существующий класс в Objective-C/Foundation? Любая существующая сторонняя библиотека, если она отсутствует?
Наконец, я смог сделать это с помощью M13MutableOrderedDictionary
для хранения отсортированного словаря и дополнительного NSMutableIndexSet
для хранения отсортированных ключей (вы должны синхронизировать изменения между словарем и набором индексов). Для получения subMap(from, to)
нужно найти ближайшее существующее значение, используя методы NSMutableIndexSet:
indexGreaterThanOrEqualToIndex
indexLessThanIndex
Они помогают вам находить существующие ключи в зависимости от ограничений/ограничений и получать subMap
с использованием метода subOrderedDictionaryWithRange
.
Накладные расходы для хранения индекса дополнительных ключей, но он все равно работает. Нет лучшего способа сделать это в Objective-C, любые улучшения оценены. Благодаря DarkDust.
Попробуйте эту старую библиотеку со списком cocoa-сортировки.
SortedDictionary *dict = [MutableSortedDictionary dictionary];
[dict setValue: @"red" forKey: @"apple"];
[dict setValue: @"yellow" forKey: @"banana"];
[dict setValue: @"orange" forKey: @"orange"];
NSString *color = [dict objectForKey: @"apple"];
Вы можете проверить, действительно ли это, что вы хотите, прочитав эту документацию
Редактировать:
Посмотрите на M13OrderedDictionary. Это позволяет создавать новые упорядоченные словари, используя subOrderedDictionaryWithRange:
это примерно эквивалентно subMap
(вам нужно определить диапазон самостоятельно).
Вы можете сделать это так:
// NSArray *allKeys = [orderedDict allKeys];
// NSUIndex from = [allKeys indexOfObject:fromObject];
// NSUIndex to = [allKeys indexOfObject:toObject];
NSUInteger from = [orderedDict indexOfKey:fromObject];
NSUInteger to = [orderedDict indexOfKey:fromObject];
if (from != NSNotFound && to != NSNotFound) {
M13OrderedDictionary *newDict = [orderedDict subOrderedDictionaryWithRange:NSMakeRange(from, to-from)];
}
Старый ответ:
Java TreeMap
- это отсортированная карта (язык Java) или словарь (Objective-C parlance). Нет никакого родного эквивалента Objective-C, и я не знаю какой-либо сторонней реализации, которая имеет что-то вроде subMap
.
Поэтому вам нужно будет перестроить эту функциональность для себя. Несколько руководств:
NSDictionary
для создания упорядоченного словаря. Это довольно старые (дни до ARC), но API и концепции не изменились с тех пор (за исключением ARC, конечно).[myDict allKeys]
, который вы можете отсортировать и получить свой диапазон ключей. Затем вы можете создать новый изменяемый словарь и скопировать соответствующий ключ/значения.[myDict mutableCopy]
Вы создаете массив ключей, которые вы не хотите сохранить), затем выполняйте [myDict mutableCopy]
и удаляйте все ненужные ключи, используя -[NSMutableDictionary removeObjectsForKeys:]
. Кстати, обратите внимание, что в отличие от Java Objective-C не позволяет вам выбрать реализацию, она автоматически выбирается во время выполнения для вас. Вот почему есть только два класса: неизменный NSDictionary
и изменяемый NSMutableDictionary
.
subMap(from, to)
к сожалению. Я могу использовать дополнительный отсортированный массив / набор для хранения отсортированных ключей и пропустить их, используя любые сторонние отсортированные словари, но мне все равно нужны методыsub(from,to)
иfirst
,last
.