我有一个数组,其中包含一个名为'Game'的自定义类。每个'游戏'都包含一个NSDate。我想根据日期重新排序我的数组,以便它们按照从最新到最旧的顺序排列。我怎么能这样做?另外,我的班级'Game'包含一个NSString。我如何重新排序我的数组,以便游戏按字母顺序排列?
答案 0 :(得分:8)
有一个真的这样做的简单方法,那就是NSSortDescriptor
:
NSArray *games = ...; //your unsorted array of Game objects
NSSortDescriptor *sortByDateDescending = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
NSArray *descriptors = [NSArray arrayWithObject:sortByDateDescending];
NSArray *sortedGames = [games sortedArrayUsingDescriptors:descriptors];
Apple已经编写了排序代码。它只需要知道要通过对进行排序的属性。这就是NSSortDescriptor
封装的内容。一旦你有一个,只需将它提供给数组,然后数组返回一个排序版本。 (或者,如果您有NSMutableArray
,则可以使用-sortUsingDescriptors:
进行就地排序。
答案 1 :(得分:2)
在重新排序之前,数组必须是NSMutableArray对象,如果我错了,请纠正我。
为了对数组进行排序,您需要在Game类中编写自定义排序方法。类似的东西:
- (NSComparisonResult)compareGameByString:(Game *)otherGame
{ return [[self stringValue] caseInsensitiveCompare:[otherGame stringValue]]; }
然后:
[yourMutableArray sortUsingSelector:@selector(compareGameByString:)];
比较日期:
- (NSComparisonResult)compareByDate:(Game *)otherGame
{
if( [otherGame isKindOfClass:[Game class]] )
{
// NSdate has a convenient compare method
return [[self dateValue] compare:[otherGame dateValue]];
}
另请注意,如果您的数组包含一个不响应这些选择器的对象,那么一个不是Game对象的对象会导致异常,并且您的应用可能会中断