0

我想排序一個人物對象的數組。班級看起來像這樣。我該如何解決這個問題?

Person 
------- 
name 
phone 

我有一個NSMutableArray充滿了這些對象。我想按每個人物對象的名稱對這個數組進行排序。

這是我試過的代碼。

NSSortDescriptor *desc = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES]; 
[personArray sortedArrayUsingDescriptors: [NSMutableArray arrayWithObject: desc]]; 

它不起作用。如何改變工作?

+0

我知道一個答案已經發布,它很可能是正確的,但作爲一般建議的話:「它不工作」不是很有幫助。你需要說明究竟是什麼被打破。例如,「personArray仍未排序」對於「獲取NSCFString不響應-sortedArrayUsingDescriptors」的異常將有完全不同的答案。 – JeremyP 2010-10-04 15:49:57

回答

3

你知道sortedArrayUsingDescriptors:返回一個新的(排序的)數組,是否正確?如果您想對陣列進行就地排序,那麼您需要確保personArrayNSMutableArray並使用其方法sortUsingDescriptors:

編輯

也許考慮看看這兩種方法會更有益:

-[NSArray sortedArrayUsingDescriptors:]; 
-[NSMutableArray sortUsingDescriptors:]; 

第一個用形容詞和名詞開始。形容詞描述名詞。名詞表示它是返回值。由於名詞是「數組」,因此該方法的返回值爲NSArray是有意義的。由於形容詞是「排序」的,因此我們可以假定返回的數組將按某種順序排列(順序由「使用」「描述符」指定)。

第二個以動詞開頭。由於動詞是一個動作詞,我們可以推斷出這實際上是一種會修改接收器本身的行爲方法。由於動詞是「排序」,因此我們可以假定在方法完成後接收器將處於某種順序。

其他 「方法對」 遵循此模式:

  • -[NSString stringByAppendingString:]-[NSMutableString appendString:]
  • -[NSArray filteredArrayUsingPredicate:]-[NSMutableArray filterUsingPredicate:]
  • -[NSCharacterSet invertedSet]-[NSMutableCharacterSet invert]
  • ...等等

既然你是你唱第一種方法(sortedArrayUsingDescriptors:),你必須檢索方法的返回值;否則你會無所事事地完成所有這些工作。如果要「到位」的數組進行排序(即修改接收器直接被賦予了新的NSArray),然後personArray必須NSMutableArray,你必須使用sortUsingDescriptors:方法。

+0

這不是我所做的嗎? personArray是人物對象的NSMutableArray。我試圖根據person對象中的名稱進行排序。 – 2010-10-04 03:23:14

+1

@awakeFromnib:不,那不是你所做的。你調用'sortedArrayUsingDescriptors:'而不是'sortArrayUsingDescriptors:'...你的開始於「排序」,他的建議從「排序」開始。 – imaginaryboy 2010-10-04 03:40:58

+0

澄清imaginaryboy的評論:sortedArray ...創建一個新的數組,留下原始未排序。 sortArray ...對源數組進行排序。 – codelark 2010-10-04 03:42:48