如何通过NSDates和NSStrings重新排序数组

时间:2011-04-24 22:07:26

标签: objective-c cocoa nsdate

我有一个数组,其中包含一个名为'Game'的自定义类。每个'游戏'都包含一个NSDate。我想根据日期重新排序我的数组,以便它们按照从最新到最旧的顺序排列。我怎么能这样做?另外,我的班级'Game'包含一个NSString。我如何重新排序我的数组,以便游戏按字母顺序排列?

2 个答案:

答案 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对象的对象会导致异常,并且您的应用可能会中断