按两个条件排序对象数组?

11

我有一个对象数组,想按两个关键字排序。这些对象是< strong>学生类型的,我想要排序的属性是< strong>成绩和< strong>姓名。

Student
{
    double grade;
    string name;
    ...
} 
如何按照成绩和姓名的顺序对对象进行排序?例如,如果我有以下列表:
Tom 9.9
Andrew 9.8
Chriestie 10
Mat 9.8
Allison 10
Ada 9.8
排序后应该是:
Allison 10
Christie 10
Tom 9.9
Ada 9.8
Andrew 9.8
Mat 9.8
而不是:
Christie 10
Allison 10
Tom 9.9
Andrew 9.8
Ada 9.8
Mat 9.8
任何指针都非常有帮助。
3个回答

23

我的Objective-C知识有些生疏,但这里有一些很好的指针(此处),还有文档。这是我的尝试...

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

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

这是我认为最简单的方法。使用排序描述符进行排序可以实现任何级别的分层排序。即,所有对象按照第一个排序描述符进行排序,任何剩余的重复项按照第二个、第三个描述符进行排序,依此类推。如果你愿意,可以查看http://github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions,了解我在`NSArray`(`NSArray+STAdditions`)上的分类,它有助于整合使用排序描述符的语法。 - CIFilter

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:)];

0
_pScheduleArr:这是我下面代码中数组的名称。该数组包含自定义模型对象。我按照日期和字母顺序比较数组。日期也存在于数组内部的数组(核心数据模型)中。
_pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^NSComparisonResult(Meetings *obj1, Meetings *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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接