2010-05-08 4 views
1

J'ai un tableau nommé 'noms' avec des chaînes ressemblant à ceci: ["name_23_something", "name_25_something", "name_2_something"]; Maintenant, je voudrais trier ce tableau dans l'ordre croissant afin qu'il ressemble à ceci: ["name_25_something", "name_23_something", "name_2_something"];Tableau de tri contenant des chaînes dans l'objectif c

Je suppose que devrait commencer avec l'extraction des chiffres que je veux que le tri se fait par eux:

for(NSString *name in arr) { 
    NSArray *nameSegments = [name componentsSeparatedByString:@"_"]; 
    NSLog("number: %@", (NSString*)[nameSegments objectAtIndex:1]);  
} 

Je pense à la création d'un dictionnaire avec les touches mais je ne suis pas sûr Si c'est la bonne méthode, peut-être quelques méthodes que je pourrais utiliser à la place? Pourriez-vous s'il vous plaît avec quelques conseils ou un exemple de code comment ce tri devrait être fait correctement.

Merci

Répondre

2
@implementation NSString (MySort) 

- (int) myValue { 
    NSArray *nameSegments = [self componentsSeparatedByString:@"_"]; 
    return [[nameSegments objectAtIndex:1] intValue]; 
} 

- (NSComparisonResult) myCompare:(NSString *)other { 
    int result = [self myValue] - [other myValue]; 
    return result < 0 ? NSOrderedAscending : result > 0 ? NSOrderedDescending : NSOrderedSame; 
} 

@end 

... 

arr = [arr sortedArrayUsingSelector:@selector(myCompare:)]; 
2

Check out -[NSArray sortedArrayUsingComparator:].

+0

malheureusement pas disponible sur l'iPhone OS. –

+1

@ed: non, mais une utilisation un peu inhibitive de la barre de défilement nous amène de cette entrée dans la documentation à la pléthore d'autres méthodes '-sortedArrayUsing ...'. –

1

Merci pour vos réponses!

Je l'ai fait comme ça, que pensez-vous:

NSInteger sortNames(id v1, id v2, void *context) { 
    NSArray *nameSegments = [(NSString*)v1 componentsSeparatedByString:@"_"]; 
    NSArray *nameSegments2 = [(NSString*)v2 componentsSeparatedByString:@"_"]; 
    int num1 = [[nameSegments objectAtIndex:1] integerValue]; 
    int num2 = [[nameSegments2 objectAtIndex:1] integerValue]; 
    if (num1 < num2) 
     return NSOrderedDescending; 
    else if (num1 > num2) 
     return NSOrderedAscending; 

    return NSOrderedSame; 
} 

names = [names sortedArrayUsingFunction:sortNames context:nil]; 

Cela se traduira par:

["name_25_something", "name_23_something", "name_2_something"]; 
+0

Cela semble bien, en dehors du nom de la fonction. 'compareNames' serait mieux. – iPadDeveloper2011

Questions connexes