Сортировка массива объектов по двум критериям?
У меня есть массив объектов, которые я хочу отсортировать по двум клавишам. Предполагается, что объекты имеют тип Студент, а свойства, которые меня интересуют для моего типа, - класс и имя.
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];