2011-11-05 49 views
0

我的數組有以下幾點:有人能讓我理解sortedArrayUsingFunction是如何工作的嗎?

{ 
    "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; 
} 
+0

就這樣我們很清楚,你目前的代碼工作正常,但你想知道爲什麼? –

+0

@craig我需要幫助理解它,因爲我不知道什麼被傳入Sort_Created_Comparer(num1,num2)。另外我如何從數組中提取sec值。所以是的,我有點失落。 – jini

回答

1

num1num2是你的陣列的2種元素和上下文是一個對象,你可以傳給你的功能,以幫助您進行排序。

您的函數將在數組上被多次調用,排序的結果將返回給您一個新的數組。

這就是你想知道的嗎?

+0

謝謝craig,它表明我的主要語言不是英語...... –

+0

非常感謝。 – jini

+0

不用擔心@VinceBurn,對已經很好的答案只是一點點擦亮:) –

0

比較函數被調用來從您的NSArray中一次比較兩個值。這就是排序完成的方式。

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; 
    } 
} 

通知有足夠的信息來確定順序。

如果我反而希望他們通過降高度進行排序,然後我可以通過以下幾點:

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。如果不是,你的比較功能自相矛盾。

相關問題