Может кто-нибудь заставить меня понять, как работает функция sortedArrayUsingFunction? - PullRequest
0 голосов
/ 06 ноября 2011

мой массив имеет следующее:

{
   "4eb57e72c7e24c014f000000" : {
     "_id" : {
       "$id" : "4eb57e72c7e24c014f000000"
     },
     "author" : "tim",
     "comments" : [],
     "created": {
       "sec" : 1320517234,
       "used" : 856000
     },
     "picture" : "http://someurl.com",
     "text" : "this is a test",
     "title" : "test",
     "type" : ["test"]
   }

Я хочу отсортировать по созданному (значение сек)

это то, что у меня есть .... Я просто не знаю, как sortedArrayUsingFunctionработает.Я имею в виду, что я сравниваю в функции сравнения ??

jokesArray = [unSortedContentArray sortedArrayUsingFunction:Sort_Created_Comparer context:self]; 

NSInteger Sort_Created_Comparer(id num1, id num2, void *context)
{
    int v1 = [num1 getSecFromJSONValue];
    int v2 = [num2 getSecFromJSONValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

Ответы [ 3 ]

1 голос
/ 06 ноября 2011

num1 и num2 - это 2 элемента вашего массива, а контекст - это объект, который вы можете передать своей функции, чтобы помочь вам в сортировке.

Ваша функция будет многократно вызываться в массиве, и результат сортировки будет возвращен вам в новом массиве.

Это то, что вам интересно?

0 голосов
/ 06 ноября 2011

Функция сравнения - это ваш способ сообщить алгоритму сортировки, как вы хотите, чтобы ваши объекты упорядочивались. Без него невозможно узнать, каким должен быть окончательный порядок.

В вашем примере кода имена аргументов num1 и num2 вводят в заблуждение. Они были бы более точно названы object1 и object2. Если object1 должно предшествовать object2, верните NSOrderedAscending. Если это должно последовать, то NSOrderedDescending в противном случае верните NSOrderedSame.

Для иллюстрации приведем пример, который сортирует гипотетические Person объекты по возрасту (от низшего к высшему).

NSInteger youngest_first(id object1, id object2, void *context) {
    if (object1.age < object2.age) {
        return NSOrderedAscending;
    }
    else if (object1.age > object2.age) {
        return NSOrderedDescending;
    }
    else {
        return NSOrderedSame;
    }
}

Обратите внимание, что я даже не использовал параметр context, поскольку мои объекты сами имели достаточно информации для определения порядка.

Если вместо этого я хочу, чтобы они сортировались по убыванию, я мог бы передать следующее:

NSInteger tallest_first(id object1, id object2, void *context) {
    if (object1.height > object2.height) {
        return NSOrderedAscending;
    }
    else if (object1.height < object2.height) {
        return NSOrderedDescending;
    }
    else {
        return NSOrderedSame;
    }
}

Одна вещь, которая очень важна , заключается в том, что ваша функция должна возвращать согласованный результат, если аргументы передаются в другом порядке. Например, если tallest_first(adam, joe, NULL) возвращает NSOrderedDescending, тогда tallest_first(joe, adam, NULL) должно вернуть NSOrderedAscending. Если нет, то ваша функция сравнения противоречит сама себе.

0 голосов
/ 06 ноября 2011

Функция сравнения вызывается для сравнения двух значений за раз из вашего NSArray. Так происходит сортировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...