2010-01-15 66 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];