Сортировка массива объектов по двум критериям?

У меня есть массив объектов, которые я хочу отсортировать по двум клавишам. Предполагается, что объекты имеют тип Студент, а свойства, которые меня интересуют для моего типа, - класс и имя.

Student
{
    double grade;
    string name;
    ...
} 

Как я могу сортировать объекты сначала по классам, а затем по имени? так, например, если у меня есть список: Том 9.9 Andrew 9.8 Chriestie 10 Мат 9.8 Allison 10 Ada 9.8

После сортировки я должен иметь: Allison 10 Кристи 10 Том 9.9 Ada 9.8 Andrew 9.8 Мат 9.8

И не Кристи 10 Allison 10 Том 9.9 Andrew 9.8 Ada 9.8 Мат 9.8

любой указатель действительно полезен.

Ответ 1

Я довольно изящный в своем знании objective-c, но там есть некоторые хорошие указатели здесь, и всегда есть documentation. Здесь моя трещина...

NSSortDescriptor *gradeSorter = [[NSSortDescriptor alloc] initWithKey:@"grade" ascending:YES];
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

[personList sortUsingDescriptors:[NSArray arrayWithObjects:gradeSorter, nameSorter, nil]];

Ответ 2

Вам необходимо реализовать собственный компаратор и использовать один из методов сортировки NSArray (например, sortedArrayUsingSelector:)

-(NSComparisonResult)compare:(Student *)student {
  // sort by name
  int nameComp = [name compare:student.name];
  if (nameComp != NSOrderedSame) return nameComp;

  // reverse ordered as desired in the question
  if (grade > student.grade)
    return NSOrderedAscending;
  else if (grade == student.grade) // watchout here
    return NSOrderedSame;
  else
    return NSOrderedDescending;
}

NSArray *unsrtedArray = ...
NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compare:)];

Ответ 3

_pScheduleArr: имя массива в моем нижнем коде. Этот массив содержит пользовательский объект модели. Я сравниваю массив от имени даты и алфавитного порядка. Дата также присутствует в массиве внутри массива (модель данных ядра).

_pScheduleArr = [[_pScheduleArr     sortedArrayUsingComparator: ^ NSComparisonResult (Meetings * obj1,                                                    Встречи * obj2) {

    NSOrderedSet *personSetObj1 = obj1.timeSlots;
    Timeslot *tt1 = [[personSetObj1 array] objectAtIndex:0];
    NSOrderedSet *personSetObj2 = obj2.timeSlots;
    Timeslot *tt2 = [[personSetObj2 array] objectAtIndex:0];
    NSDate *date11 = tt1.startTime;
    NSDate *date12 = tt2.startTime;

      NSComparisonResult comresult = [date11 compare:date12];
      if (comresult == NSOrderedSame) {
          comresult = [obj1.title compare:obj2.title];
      }
      return comresult;

  }] mutableCopy];