J'ai plusieurs tableaux qui doivent être triés côte à côte.
Par exemple, le premier tableau a des noms: Je voudrais trier le tableau des noms alphabétiquement, puis avoir le tableau d'adresse trié à côté afin qu'ils vont toujours ensemble, avec "Hollywoodwy Bld" ayant même index que "Joe". Je sais comment trier un tableau alphabétique avec p> mais existe-t-il un moyen facile d'obtenir le second tableau trié à l'aide de l'ordre approprié? P> P> @ [@ "joe", @ "Anna", @ "Michael", @ "Michael", @ "Michael", @ "Michael", @ "Michael", @ "Michael", @ "Michael", @ "Michael", @ " Kim "] code>, et
et l'autre array contient des adresses:
@ [@ "hollywood bld", @ "une rue 3", @ "cette autre rue", @ "Country Road"] Code>, où les index des tableaux vont ensemble . "Joe" vit à "Hollywood Bld" et ainsi de suite. P>
4 Réponses :
Vous pouvez probablement le faire en gardant une trace des index des objets avant et après le tri, mais il serait peut-être plus facile d'avoir un seul objet qui gère toutes ces propriétés alors que vous stockez Ces objets dans un seul tableau que vous pouvez trier par nom code> ou
adresse code> chemins de clé p> p> p>
Le meilleur moyen est de restructurer vos données afin que vous n'avez qu'un seul tableau. Dans votre exemple, il serait très logique de créer une nouvelle classe avec le nom et l'adresse, les mettre dans un tableau et le trier par nom. P>
Ou simplement créer un tableau de dictionnaires, chacun contenant un nom et l'adresse correspondante.
Certes, bien que les dictionnaires me quittent toujours avec le sentiment que quelqu'un ne se souciait pas assez du but de leurs données de la catégoriser bien. :-)
p [i] = i code> li>
- Trier la permutation selon la touche code> nom code> du premier tableau li>
- Utilisez la permutation pour commander les deux tableaux LI>
Exemple: disons que le premier tableau est {"rapide", "brun", "renard"} code>. La permutation commence comme {0, 1, 2} code> et devient {1, 2, 0} code> après le tri. Maintenant, vous pouvez passer par le tableau de permutation et réchrogrammer le tableau d'origine et le second tableau au besoin. P> NSArray *first = [NSArray arrayWithObjects: @"quick", @"brown", @"fox", @"jumps", nil];
NSArray *second = [NSArray arrayWithObjects: @"jack", @"loves", @"my", @"sphinx", nil];
NSMutableArray *p = [NSMutableArray arrayWithCapacity:first.count];
for (NSUInteger i = 0 ; i != first.count ; i++) {
[p addObject:[NSNumber numberWithInteger:i]];
}
[p sortWithOptions:0 usingComparator:^NSComparisonResult(id obj1, id obj2) {
// Modify this to use [first objectAtIndex:[obj1 intValue]].name property
NSString *lhs = [first objectAtIndex:[obj1 intValue]];
// Same goes for the next line: use the name
NSString *rhs = [first objectAtIndex:[obj2 intValue]];
return [lhs compare:rhs];
}];
NSMutableArray *sortedFirst = [NSMutableArray arrayWithCapacity:first.count];
NSMutableArray *sortedSecond = [NSMutableArray arrayWithCapacity:first.count];
[p enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSUInteger pos = [obj intValue];
[sortedFirst addObject:[first objectAtIndex:pos]];
[sortedSecond addObject:[second objectAtIndex:pos]];
}];
NSLog(@"%@", sortedFirst);
NSLog(@"%@", sortedSecond);
Tout d'abord, vous voudrez peut-être re-considérer une architecture qui vous oblige à trier deux tableaux de manière parallèle comme celle-ci. Cela dit, vous pouvez le faire en créant un éventail temporaire de dictionnaires qui conservent les éléments des deux tableaux couplés.
Ensuite, vous triez le tableau combiné et extrayez les deux matrices, triés comme demandé: P>
Données d'origine: P>
NSMutableArray *combined = [NSMutableArray array]; for (NSUInteger i = 0; i < names.count; i++) { [combined addObject: @{@"name" : names[i], @"address": addresses[i]}]; } [combined sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]]; names = [combined valueForKey:@"name"]; addresses = [combined valueForKey:@"address"];
Nice utilisation de -valueforkey: code>.
Utilisez objetforkey code> au lieu de
valueforkey code>.
Connexes: Trier NsmutableArray et trier un autre NsmutableArray le long