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