Сортировка NSArray - PullRequest
       7

Сортировка NSArray

4 голосов
/ 17 мая 2010

У меня есть NSArray объектов. Эти объекты имеют атрибут int, называемый «расстояние». Я хочу отсортировать массив по расстоянию.

Может кто-нибудь сказать, пожалуйста, как это сделать? Я не могу понять, как работают методы sortUsingSelector или sortUsingDescriptor ...

Спасибо

Ответы [ 2 ]

27 голосов
/ 17 мая 2010

Я предполагаю, что вы используете NSMutableArray, потому что NSArray является неизменным.

Когда вы сортируете что-то, вы хотите, чтобы конечный результат был упорядочен как

x1 <= x2 <= x3 <= x4 <= ... <= xN

Как определить это <=? В ObjC есть 3 решения.


1. -sortUsingSelector:

[arr sortUsingSelector:@selector(foo:)] означает, что его элементы будут сравниваться как *

x <= y      is equivalent to      [x foo:y] <= 0

Например, для сортировки списка строк без учета регистра вы используете [arr sortUsingSelector:@selector(caseInsensitiveCompare:)].


2. -sortUsingFunction:context:

Это похоже на -sortUsingSelector:, но в качестве ввода используется указатель на функцию. [arr sortUsingFunction:funcptr context:ctx] означает, что его элементы будут сравниваться как

x <= y      is equivalent to      funcptr(x, y, ctx) <= 0

3. -sortUsingDescriptors:

Это самый сложный. Он принимает список NSSortDescriptors, которые описывают ожидаемый порядок свойств. Один базовый пример:

NSSortDescriptor* desc = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
[arr sortUsingDescriptors:[NSArray arrayWithObject:desc]];
[desc release];

дескриптор сообщает программе сортировки «сортировать по ключу distance в порядке возрастания».

Предположим, есть 2 ключа, целые числа x, затем возрастающие и строки y, убывающие, тогда вы можете написать

NSSortDescriptor* dx = [[NSSortDescriptor alloc] initWithKey:@"x" ascending:YES];
NSSortDescriptor* dy = [[NSSortDescriptor alloc] initWithKey:@"y" ascending:NO selector:@selector(caseInsensitiveCompare:)];
[arr sortUsingDescriptors:[NSArray arrayWithObjects:x, y, nil]];
[dx release];
[dy release];

и т. Д.


Примечание: * На самом деле вы должны возвращать только -1, 0 или 1.

3 голосов
/ 17 мая 2010

Finnaly Я узнал, как это сделать:

после @implementation:

static NSInteger sort(Myclass *obj1, Myclass *obj2, void *context) {

if(obj1.distance < obj2.distance)
return NSOrderedAscending;
else if(obj1.distance > obj2.distance)
return NSOrderedDescending;
else
return NSOrderedSame;

Тогда, где вам нужно отсортировать NSArray:

NSArray *sortedArray = [unsortedArray sortedArrayUsingFunction:sort context:NULL];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...