Как переупорядочить массив по NSDates и NSStrings - PullRequest
1 голос
/ 25 апреля 2011

У меня есть массив, который содержит мой собственный класс под названием «Game».Каждая «Игра» содержит NSDate.Я хотел бы изменить порядок моего массива на основе дат, чтобы они были в порядке от самых новых до самых старых.Как я мог это сделать?Кроме того, мой класс «Игра» содержит строку NSString.Как я мог изменить порядок массива, чтобы игры были расположены в алфавитном порядке?

Ответы [ 2 ]

8 голосов
/ 25 апреля 2011

Существует ДЕЙСТВИТЕЛЬНО простой способ сделать это, и это с 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:)

2 голосов
/ 25 апреля 2011

Массив должен быть объектом 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, вы получите исключение, и ваше приложение может сломаться

...