有人能让我理解sortedArrayUsingFunction是如何工作的吗?

时间:2011-11-05 22:53:59

标签: objective-c ios nsarray

我的数组有以下内容:

{
   "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 个答案:

答案 0 :(得分:1)

num1num2是数组的2个元素,上下文是一个对象,您可以将其传递给函数以帮助您进行排序。

您的函数将在数组上多次调用,并且排序结果将以新数组的形式返回给您。

这是你想知道的吗?

答案 1 :(得分:0)

调用比较函数以从NSArray一次比较两个值。这就是排序的完成方式。

答案 2 :(得分:0)

比较功能是告诉排序算法您希望对象如何排序的方式。没有它,它无法知道最终的顺序应该是什么。

在您的示例代码中,参数名称num1num2非常具有误导性。它们会更准确地命名为object1object2。如果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。如果不是,你的比较功能就会自相矛盾。