11
votes

Tri des objets d'objets par deux critères?

J'ai un tableau d'objets que je veux trier par deux clés. Les objets permettent de dire sont de type étudiant strong> et les propriétés que je suis incitée pour mon genre sont note forte> et nom strong>.

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


0 commentaires

3 Réponses :


3
votes

Vous devez essentiellement mettre en œuvre votre propre comparateur et utiliser l'un des méthodes de tri Nsarray code> (par exemple, SORTEDARRAYUSINGSELLector: > )

-(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 commentaires

23
votes

Je suis assez facilesse sur ma connaissance de mon objectif-C, mais il y a de bons pointeurs ici et il y a Toujours le documentation . Voici ma cassette ...

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

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


1 commentaires

C'est le moyen le plus simple de le faire à mon avis. Le tri en utilisant des descripteurs de tri vous permet d'obtenir n'importe quel niveau de tri hiérarchique. C'est-à-dire que tous les objets sont triés selon le premier descripteur de tri, les doublons restants sont triés en fonction du deuxième troisième descripteur, etc. Si vous le souhaitez, voir Github.com/Lucastizma/spot_trot_helpers#nsarray+Stadditions pour mon Catégorie sur nsarray ( nsarray + stadditions ) qui aide à consolider la syntaxe pour utiliser des descripteurs de tri.



0
votes

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

_PSCHEDULEARR = [[_PSCHEDULEARR SoyeDarrayUtilisationComparator: ^ NscomparisonResult (réunions * obj1, Réunions * obj2) { xxx


0 commentaires