Вопрос по cocoa, sorting, objective-c – Каков наиболее эффективный способ сортировки NSSet?

63

Какой самый эффективный способ сортировки объектов вNSSet/NSMutableSet на основе свойства объектов в наборе? Прямо сейчас я делаю это, перебирая каждый объект, добавляя их вNSMutableArrayи сортировать этот массив сNSSortDescriptor.

Ваш Ответ

6   ответов
2

ки, Массивы являются упорядоченными коллекциями

Глядя на 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];
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededsortedArrayUsingFunction:context:Error: User Rate Limit ExceededidError: User Rate Limit Exceededvoid *Error: User Rate Limit ExceededNSIntegerError: User Rate Limit Exceeded
0

Начиная с OS X 10.7 и iOS 5.0 естьNSOrderedSet, Вы можете использовать его, чтобы держать объекты в наборе и поддерживать их порядок.NSMutableOrderedSet есть методы для сортировки. В некоторых ситуациях это может повысить производительность, поскольку вам не нужно создавать отдельный объект, напримерNSArray хранить отсортированные вещи.

114

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

Edit: Для iOS & # x2265; 4.0 и Mac OS X & # x2265; 10.6 вы можете напрямую использовать

[mySet sortedArrayUsingDescriptors:descriptors];
Error: User Rate Limit Exceeded Boon
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

& quot; установить результат как NSArray ... И все верхние подсказки работают только с Array :)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

Работать отлично, и не нужно иначе :)

15

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

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

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

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

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

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

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

8

5.0 и Mac OS X & # x2265; 10.7 вы можете напрямую использоватьNSOrderedSet

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

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