Замена Java в TreeMap в Objective-C?

1

Я использую TreeMap в Java-коде, который будет перенесен в ios (цель-c). Он должен быть таким же эффективным, как java original (для получения .subMap() как минимум). Для этого существует какой-либо существующий класс в Objective-C/Foundation? Любая существующая сторонняя библиотека, если она отсутствует?

Теги:
xcode

3 ответа

0
Лучший ответ

Наконец, я смог сделать это с помощью M13MutableOrderedDictionary для хранения отсортированного словаря и дополнительного NSMutableIndexSet для хранения отсортированных ключей (вы должны синхронизировать изменения между словарем и набором индексов). Для получения subMap(from, to) нужно найти ближайшее существующее значение, используя методы NSMutableIndexSet:

  • indexGreaterThanOrEqualToIndex
  • indexLessThanIndex
  • ...

Они помогают вам находить существующие ключи в зависимости от ограничений/ограничений и получать subMap с использованием метода subOrderedDictionaryWithRange.

Накладные расходы для хранения индекса дополнительных ключей, но он все равно работает. Нет лучшего способа сделать это в Objective-C, любые улучшения оценены. Благодаря DarkDust.

1

Попробуйте эту старую библиотеку со списком 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"];

Вы можете проверить, действительно ли это, что вы хотите, прочитав эту документацию

  • 0
    я не вижу никаких subMap(from, to) к сожалению. Я могу использовать дополнительный отсортированный массив / набор для хранения отсортированных ключей и пропустить их, используя любые сторонние отсортированные словари, но мне все равно нужны методы sub(from,to) и first , last .
0

Редактировать:

Посмотрите на 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.

  • 0
    спасибо за ссылки. но мне кажется, что мне предложили изобрести колесо .. никаких реализаций в obj-c на самом деле?
  • 0
    Ну, существуют упорядоченные словарных реализаций, например , это одно или это одно . Там, безусловно, еще больше. Но я не видел ни одного с функциональностью subMap .
Показать ещё 15 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню