2010-01-15 36 views
10

我有一个对象数组,我想按两个键排序。对象可以说是类型学生和我感兴趣的属性我的排序是等级名称对象的数组按两个标准排序?

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

我该如何按照等级和名称排序对象?因此,举例来说,如果我有名单: 汤姆9.9 安德鲁9.8 Chriestie 10 垫9.8 佳佳10 阿达9.8

排序后,我应该有: 佳佳10 克里斯蒂10 汤姆9.9 阿达9.8 安德鲁9.8 垫9.8

而且不 克里斯蒂10 佳佳10 汤姆9.9 安德鲁9.8 Ada 9.8 垫子9.8

任何指针真的很有帮助。

回答

22

我对我的Objective-C的知识很古怪,但有一些很好的指针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]]; 
+0

这是我认为最简单的方法。使用排序描述符进行排序可以实现任何级别的排序。即,根据第一分类描述符对所有对象进行排序,根据第二第三描述符对任何剩余的重复进行分类,依此类推。如果需要,请参阅http://github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions,了解我的'NSArray'('NSArray + STAdditions')类别,它有助于巩固使用排序描述符的语法。 – LucasTizma 2010-01-16 09:24:34

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

我会尝试。谢谢! – 2010-01-15 13:47:01

0

_pScheduleArr:在我下面的代码中的数组名称。该数组包含自定义模型对象。我代表日期和字母顺序比较阵列。日期也存在于数组(核心数据模型)中的数组中。

_pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^ NSComparisonResult(会议* 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];