2010-01-15 5 views
10

J'ai un tableau d'objets que je veux trier par deux clés. Les objets disons sont de type Étudiant et les propriétés que je suis intrested dans mon genre sont grade et nom.Tri d'un tableau d'objets par deux critères?

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

Comment puis-je trier les objets d'abord par année, puis par son nom? Ainsi, par exemple si j'ai la liste: Tom 9,9 Andrew 9,8 Chriestie 10 Mat 9,8 Allison 10 Ada 9.8

Une fois le tri je devrais avoir: Allison 10 Christie 10 Tom 9,9 Ada 9.8 Andrew 9,8 Mat 9,8

Et pas Christie 10 Allison 10 Tom 9,9 Andrew 9,8 Ada 9,8 Mat 9,8

n'importe quel pointeur est vraiment utile.

Répondre

22

Je suis flakey sur ma connaissance objective-c, mais il y a quelques bons pointeurs here et il y a toujours le documentation. Voici ma fissure à elle ...

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

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

C'est la façon la plus facile de le faire à mon avis. Le tri à l'aide de descripteurs de tri vous permet d'atteindre n'importe quel niveau de tri hiérarchique. c'est-à-dire que tous les objets sont triés en fonction du premier descripteur de tri, tous les doublons restants sont triés en fonction du second descripteur de troisième, et ainsi de suite. Si vous voulez, voir http://github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions pour ma catégorie sur NSArray (NSArray + STAdditions) qui aide à consolider la syntaxe pour l'utilisation des descripteurs de tri. – LucasTizma

3

Vous avez besoin essentiellement de mettre en œuvre votre propre comparateur et utiliser l'une des NSArray méthodes de tri (par exemple 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

je vais essayer. Je vous remercie! –

0

_pScheduleArr: Le nom de tableau dans mon code ci-dessous. Ce tableau contient l'objet de modèle personnalisé. Je compare le tableau au nom de la date et de l'ordre alphabétique. La date est également présente dans le tableau à l'intérieur du tableau (modèle de données de base).

_pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^NSComparisonResult (réunions * Obj1, réunions * 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];