Сортировка массива объектов по двум критериям? - PullRequest
10 голосов
/ 15 января 2010

У меня есть массив объектов, которые я хочу отсортировать по двум ключам. Допустим, объекты относятся к типу Student , а свойства, которые мне интересны для моего вида: grade и name .

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

Как я могу отсортировать объекты сначала по классу, а затем по имени? так, например, если у меня есть список: Том 9,9 Андрей 9,8 Кристи 10 Мат 9,8 Эллисон 10 Ада 9,8

После сортировки я должен иметь: Эллисон 10 Кристи 10 Том 9,9 Ада 9,8 Андрей 9,8 Мат 9,8

а не Кристи 10 Эллисон 10 Том 9,9 Андрей 9,8 Ада 9,8 Мат 9,8

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

Ответы [ 3 ]

22 голосов
/ 15 января 2010

Я довольно слабо разбираюсь в своих целях, но есть несколько хороших указателей здесь и всегда есть документация Вот моя трещина в этом ...

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

[personList sortUsingDescriptors:[NSArray arrayWithObjects:gradeSorter, nameSorter, nil]];
3 голосов
/ 15 января 2010

Вам необходимо реализовать собственный компаратор и использовать один из 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:)];
0 голосов
/ 21 августа 2015

_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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...