我有一个对象数组,我想用两个键排序。这些对象可以说类型为学生,而我对我的排序感兴趣的属性是成绩和名称。
Student
{
double grade;
string name;
...
}
我如何先按等级然后按名称对对象进行排序?所以例如,如果我有列表: 汤姆9.9 安德鲁9.8 Chriestie 10 垫9.8 艾莉森10 阿达9.8
排序之后我应该: 艾莉森10 克里斯蒂10 汤姆9.9 阿达9.8 安德鲁9.8 Mat 9.8
而不是 克里斯蒂10 艾莉森10 汤姆9.9 安德鲁9.8 阿达9.8 Mat 9.8
任何指针都非常有用。
答案 0 :(得分:22)
我对我的客观知识非常了解,但有一些好的指针here并且始终存在documentation。这是我对它的破解......
NSSortDescriptor *gradeSorter = [[NSSortDescriptor alloc] initWithKey:@"grade" ascending:YES];
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[personList sortUsingDescriptors:[NSArray arrayWithObjects:gradeSorter, nameSorter, nil]];
答案 1 :(得分:3)
您基本上需要实施自己的比较器并使用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:)];
答案 2 :(得分:0)
_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];