Méthode de comparaison
Soit vous implémentez une méthode de comparaison pour votre objet:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (meilleur)
ou encore mieux:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Vous pouvez facilement trier par plusieurs clés en en ajoutant plusieurs au tableau. L'utilisation de méthodes de comparaison personnalisées est également possible. Jetez un œil à la documentation .
Blocs (brillants!)
Il y a aussi la possibilité de trier avec un bloc depuis Mac OS X 10.6 et iOS 4:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Performance
Les -compare:
méthodes basées sur des blocs seront un peu plus rapides, en général, que leur utilisation NSSortDescriptor
car cette dernière repose sur KVC. Le principal avantage de la NSSortDescriptor
méthode est qu'elle fournit un moyen de définir votre ordre de tri en utilisant des données, plutôt que du code, ce qui facilite par exemple la configuration des choses afin que les utilisateurs puissent trier un NSTableView
en cliquant sur la ligne d'en-tête.
NSMutableArray
je préfère utiliser les méthodessortUsingDescriptors
,sortUsingFunction
ousortUsingSelector
. Dans la mesure où le tableau est modifiable, je n'ai généralement pas besoin d'une copie triée.Voir la
NSMutableArray
méthodesortUsingFunction:context:
Vous devrez configurer une fonction de comparaison qui prend deux objets (de type
Person
, car vous comparez deuxPerson
objets) et un paramètre de contexte .Les deux objets ne sont que des instances de
Person
. Le troisième objet est une chaîne, par exemple @ "birthDate".Cette fonction renvoie un
NSComparisonResult
: Elle renvoieNSOrderedAscending
siPersonA.birthDate
<PersonB.birthDate
. Il reviendraNSOrderedDescending
siPersonA.birthDate
>PersonB.birthDate
. Enfin, il retourneraNSOrderedSame
siPersonA.birthDate
==PersonB.birthDate
.C'est un pseudocode grossier; vous devrez préciser ce que signifie qu'une date soit "moins", "plus" ou "égale" à une autre date (par exemple, en comparant les secondes depuis l'époque, etc.):
Si vous voulez quelque chose de plus compact, vous pouvez utiliser des opérateurs ternaires:
L'intégration pourrait peut-être accélérer un peu cela, si vous le faites souvent.
la source
Je l'ai fait dans iOS 4 en utilisant un bloc. J'ai dû convertir les éléments de mon tableau d'id en mon type de classe. Dans ce cas, il s'agissait d'une classe appelée Score avec une propriété appelée points.
Vous devez également décider quoi faire si les éléments de votre tableau ne sont pas du bon type, pour cet exemple, je viens de revenir
NSOrderedSame
, mais dans mon code, j'ai cependant une exception.PS: c'est le tri par ordre décroissant.
la source
downcasting
ne nécessite pas de transtypage avant la variable faible.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
À partir d'iOS 4, vous pouvez également utiliser des blocs pour le tri.
Pour cet exemple particulier, je suppose que les objets de votre tableau ont une méthode "position", qui renvoie un
NSInteger
.Remarque: le tableau "trié" sera publié automatiquement.
la source
J'ai tout essayé, mais cela a fonctionné pour moi. Dans une classe, j'ai une autre classe nommée "
crimeScene
", et je veux trier par une propriété de "crimeScene
".Ça fonctionne super bien:
la source
Il manque une étape dans la deuxième réponse de Georg Schölly , mais cela fonctionne très bien.
// a ajouté le 's' parce que du temps a été perdu lorsque j'ai copié et collé et qu'il a échoué sans le 's' dans sortedArrayUsingDescriptors
la source
Merci, ça marche bien ...
la source
Vos
Person
objets doivent implémenter une méthode, par exemple cellecompare:
qui prend un autrePerson
objet, et revenir enNSComparisonResult
fonction de la relation entre les 2 objets.Ensuite, vous appelleriez
sortedArrayUsingSelector:
avec@selector(compare:)
et cela devrait être fait.Il existe d'autres façons, mais pour autant que je sache, il n'y a pas d'équivalent Cocoa de l'
Comparable
interface. L'utilisationsortedArrayUsingSelector:
est probablement la façon la plus indolore de le faire.la source
Les blocs iOS 4 vous sauveront :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html un peu de description
la source
Pour
NSMutableArray
, utilisez lasortUsingSelector
méthode. Il trie sur place, sans créer de nouvelle instance.la source
sortUsingComparator:
.Vous pouvez utiliser la méthode générique suivante à votre fin. Cela devrait résoudre votre problème.
la source
Si vous
NSNumbers
triez simplement un tableau de , vous pouvez les trier avec 1 appel:Cela fonctionne car les objets du tableau (
NSNumber
objets) implémentent la méthode de comparaison. Vous pouvez faire la même chose pour lesNSString
objets, ou même pour un tableau d'objets de données personnalisés qui implémentent une méthode de comparaison.Voici un exemple de code utilisant des blocs de comparaison. Il trie un tableau de dictionnaires où chaque dictionnaire inclut un nombre dans une clé "sort_key".
Le code ci-dessus passe par le travail d'obtention d'une valeur entière pour chaque clé de tri et de leur comparaison, comme une illustration de la façon de le faire. Puisque les
NSNumber
objets implémentent une méthode de comparaison, elle pourrait être réécrite beaucoup plus simplement:ou le corps du comparateur pourrait même être distillé jusqu'à 1 ligne:
J'ai tendance à préférer des instructions simples et de nombreuses variables temporaires car le code est plus facile à lire et à déboguer. Le compilateur optimise de toute façon les variables temporaires, il n'y a donc aucun avantage à la version tout-en-un.
la source
J'ai créé une petite bibliothèque de méthodes de catégorie, appelée Linq to ObjectiveC , qui rend ce genre de chose plus facile. En utilisant la méthode de tri avec un sélecteur à clé, vous pouvez trier
birthDate
comme suit:la source
Je viens de faire un tri à plusieurs niveaux en fonction des besoins personnalisés.
// trie les valeurs
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
la source
J'ai utilisé sortUsingFunction :: dans certains de mes projets:
la source
Vous utilisez NSSortDescriptor pour trier un NSMutableArray avec des objets personnalisés
la source
la source
Le tri
NSMutableArray
est très simple:la source
Trier à l'aide de NSComparator
Si nous voulons trier les objets personnalisés que nous devons fournir
NSComparator
, qui est utilisé pour comparer les objets personnalisés. Le bloc renvoie uneNSComparisonResult
valeur pour indiquer l'ordre des deux objets. Donc, pour trier le tableau entier, ilNSComparator
est utilisé de la manière suivante.Tri à l'aide de NSSortDescriptor
Supposons, par exemple, que nous avons un tableau contenant des instances d'une classe personnalisée, Employee a des attributs prénom, nom et âge. L'exemple suivant illustre comment créer un NSSortDescriptor qui peut être utilisé pour trier le contenu du tableau dans l'ordre croissant par la clé d'âge.
Tri à l'aide de comparaisons personnalisées Les
noms sont des chaînes et lorsque vous triez des chaînes à présenter à l'utilisateur, vous devez toujours utiliser une comparaison localisée. Souvent, vous souhaitez également effectuer une comparaison insensible à la casse. Voici un exemple avec (localizedStandardCompare :) pour classer le tableau par nom et prénom.
Pour référence et discussion détaillée, veuillez consulter: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / objective-c / comment-trier-nsarray-avec-des-objets-personnalisés /
la source
Les protocoles et la programmation fonctionnelle de Swift rendent cela très simple: il vous suffit de rendre votre classe conforme au protocole comparable, d'implémenter les méthodes requises par le protocole, puis d'utiliser la fonction de tri élevé (par:) pour créer un tableau trié sans avoir besoin d'utiliser tableaux mutables d'ailleurs.
la source
Dans mon cas, j'utilise "sortedArrayUsingComparator" pour trier un tableau. Regardez le code ci-dessous.
Mon objet est aussi,
la source
Vous devez créer sortDescriptor et ensuite vous pouvez trier le nsmutablearray en utilisant sortDescriptor comme ci-dessous.
la source
Utilisez comme ceci pour les objets imbriqués,
lastRoute est un objet et cet objet contient l'objet to, cet objet contient les valeurs de chaîne de nom.
la source
Trier le tableau dans Swift
Pour la
Swifty
personne ci-dessous est une technique très propre pour atteindre l'objectif ci-dessus pour le monde entier. Permet d'avoir un exemple de classe personnaliséeUser
dont certains ont des attributs.Nous avons maintenant un tableau que nous devons trier sur la base de
createdDate
l'ordre croissant et / ou décroissant. Permet donc d'ajouter une fonction pour la comparaison des dates.Permet maintenant avoir un
extension
deArray
pourUser
. En termes simples, ajoutons quelques méthodes uniquement aux tableaux qui ne contiennent que desUser
objets.Utilisation pour l'ordre croissant
Utilisation pour l'ordre décroissant
Utilisation pour la même commande
la source
Version Swift: 5.1
Si vous avez une structure ou une classe personnalisée et que vous souhaitez les trier arbitrairement, vous devez appeler sort () à l'aide d'une fermeture de fin qui trie sur un champ que vous spécifiez. Voici un exemple utilisant un tableau de structures personnalisées qui trie sur une propriété particulière:
Si vous souhaitez renvoyer un tableau trié plutôt que de le trier sur place, utilisez sorted () comme ceci:
la source
la source
la source