Что самый эффективный путь состоит в том, чтобы отсортировать NSSet?

Nunit плохо работает со смешанными проектами в C ++, поэтому мне пришлось отказаться от него

.
63
задан gklka 22 August 2013 в 13:43
поделиться

3 ответа

попробуйте использовать

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

Изменить : для iOS ≥ 4.0 и Mac OS X ≥ 10.6 вы можете напрямую использовать

[mySet sortedArrayUsingDescriptors:descriptors];
114
ответ дан 24 November 2019 в 16:15
поделиться

«Самый эффективный способ» сортировки набора объектов зависит от того, что вы на самом деле имеете в виду. Случайное предположение (сделанное в предыдущих ответах) - это одноразовый вид объектов в наборе. В данном случае я бы сказал, что это в значительной степени перемешивание между тем, что предлагает @cobbal , и тем, что вы придумали - вероятно, что-то вроде следующего:

NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
    [array addObject:anObject];
[array sortUsingDescriptors:descriptors];

(Я говорю, что это подбрасывание поскольку подход @cobbal создает два автоматически выпускаемых массива, поэтому объем памяти удваивается. Это несущественно для небольших наборов объектов, но технически ни один из подходов не очень эффективен.)

Однако , если вы сортируете элементы в устанавливать более одного раза (и особенно, если это обычное дело), ​​это определенно неэффективный подход. Вы можете сохранить NSMutableArray и синхронизировать его с NSSet, а затем каждый раз вызывать -sortUsingDescriptors:, но даже если массив уже отсортирован, он все равно потребует N сравнений.

Какао само по себе просто не обеспечивает эффективного подход к хранению коллекции в отсортированном порядке. В Java есть класс TreeSet , который поддерживает элементы в отсортированном порядке всякий раз, когда объект вставляется или удаляется, но Какао этого не делает. Именно эта проблема побудила меня разработать нечто подобное для себя.

В рамках унаследованной и модернизированной мной структуры структур данных я создал протокол и несколько реализаций для сортированных наборов . Любой из конкретных подклассов будет поддерживать набор отдельных объектов в отсортированном порядке. Еще предстоит внести некоторые уточнения - прежде всего, он сортирует на основе результата -compare: (который должен реализовывать каждый объект в наборе) и еще не принимает NSSortDescriptor. (Обходной путь заключается в реализации -compare: для сравнения интересующего свойства объектов.)

Одним из возможных недостатков является то, что эти классы (в настоящее время) не являются подклассами NS (Mutable) Set, поэтому, если вы должны передать NSSet , заказываться не будет. (В протоколе есть метод -set, который возвращает NSSet, который, конечно, неупорядочен.) Я планирую исправить это в ближайшее время, как я сделал с подклассами NSMutableDictionary в структуре. Отзывы, безусловно, приветствуются. : -)

(Обходной путь заключается в реализации -compare: для сравнения интересующего свойства объектов.)

Одним из возможных недостатков является то, что эти классы (в настоящее время) не являются подклассами NS (Mutable) Set, поэтому, если вы должны передать NSSet , заказываться не будет. (В протоколе есть метод -set, который возвращает NSSet, который, конечно, неупорядочен.) Я планирую исправить это в ближайшее время, как я сделал с подклассами NSMutableDictionary в структуре. Отзывы, безусловно, приветствуются. : -)

(Обходной путь заключается в реализации -compare: для сравнения интересующего свойства объектов.)

Одним из возможных недостатков является то, что эти классы (в настоящее время) не являются подклассами NS (Mutable) Set, поэтому, если вы должны передать NSSet , заказываться не будет. (В протоколе есть метод -set, который возвращает NSSet, который, конечно, неупорядочен.) Я планирую исправить это в ближайшее время, как я сделал с подклассами NSMutableDictionary в структуре. Отзывы, безусловно, приветствуются. : -)

мы сделали с подклассами NSMutableDictionary в структуре. Отзывы, безусловно, приветствуются. : -)

мы сделали с подклассами NSMutableDictionary в структуре. Отзывы, безусловно, приветствуются. : -)

15
ответ дан 24 November 2019 в 16:15
поделиться

NSSet - это набор неупорядоченных объектов. Рассмотрение ссылок на яблоки Массивы - это упорядоченные коллекции.

При рассмотрении NSArray есть обсуждение с примерами сортировки на http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays ...

Пример из ссылки:

NSInteger alphabeticSort(id string1, id string2, void *reverse)
{
    if (*(BOOL *)reverse == YES) {
        return [string2 localizedCaseInsensitiveCompare:string1];
    }
    return [string1 localizedCaseInsensitiveCompare:string2];
}

// assuming anArray is array of unsorted strings

NSArray *sortedArray;

// sort using a selector
sortedArray =
    [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

// sort using a function
BOOL reverseSort = NO;
sortedArray =
    [anArray sortedArrayUsingFunction:alphabeticSort context:&reverseSort];
2
ответ дан 24 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: