2012-11-06 3 views
3

J'ai un tableau trié de valeurs NSString, je voudrais savoir comment capturer la première lettre de chaque chaîne seulement quand la première lettre est différente et la mettre dans un nouveau NSArray .comment saisir la première lettre de chaque entrée de tableau

Par exemple, si je un tableau qui ressemblait comme

"a, aaa, aaaa, b, c, d, dd, ddd" 

ce serait comme cela dans la nouvelle NSArray

"a, b, c, d" 

Toute aide serait grandement appréciée.

+0

Créez un mutableArray vide. Itérer à travers le trié, en gardant la trace de la précédenteFirstLetter et le comparer à l'actuel, si différent, puis ajouter cette lettre à votre mutableArray et mettre à jour le previousFirstLetter. – yuf

Répondre

9

Quelque chose comme ceci:

- (NSArray *)indexLettersForStrings:(NSArray *)strings { 
    NSMutableArray *letters = [NSMutableArray array]; 
    NSString *currentLetter = nil; 
    for (NSString *string in strings) { 
     if (string.length > 0) { 
      NSString *letter = [string substringToIndex:1]; 
      if (![letter isEqualToString:currentLetter]) { 
       [letters addObject:letter]; 
       currentLetter = letter; 
      } 
     } 
    } 
    return [NSArray arrayWithArray:letters]; 
} 
+0

opps désolé pour la réponse tardive .. essayé un tas de choses .. alors vu cela essayé et ça fonctionne parfaitement! merci beaucoup :) – HurkNburkS

0
NSArray *array = [NSArray arrayWithObjects:@"a", @"aaa", @"aaaa",@"b", @"c", @"d", @"dd", @"ddd", nil]; 
BOOL control = YES; 
NSMutableArray *array2 = [NSMutableArray array]; 
for (int i = 0; i<array.count; i++) { 
    for (int j = 0; j<array2.count;j++){ 
     if ([[array2 objectAtIndex:j]isEqualToString:[[array objectAtIndex:i]substringToIndex:1]]){ 
      control = NO; 
     } 
     else 
      control = YES; 
    } 
    if (control) 
     [array2 addObject:[[array objectAtIndex:i]substringToIndex:1]]; 
} 
0

Essayez ceci:

NSArray *arr = @[@"a", @"aaa", @"aaaa", @"b", @"c", @"d", @"dd", @"ddd"]; 
NSMutableArray *newArr = [NSMutableArray array]; 
NSMutableSet *set = [NSMutableSet set]; 

for (NSString *str in arr) 
{ 
    if (![set containsObject:[str substringToIndex:1]]) 
     [newArr addObject:[str substringToIndex:1]]; 
    [set addObject:[str substringToIndex:1]]; 

} 

NSLog(@"%@", newArr); 

Il utilise un ensemble pour garder une trace des événements qui ont déjà jeté passé. Quand il n'existe pas, il les place dans un nouveau tableau.

+0

Faire un 'containsObject:' alors 'addObject:' avec un 'NSSet' est redondant. En outre, ils nécessitent un 'NSArray' comme résultat final. Voir ma réponse ci-dessous. – WDUK

+0

bien qu'il demande que la réponse soit dans un nouveau tableau –

2

NSString + LetterIndex.h

@interface NSString (LetterIndex) 
@property (nonatomic, readonly) NSString * firstLetter; 
@end 

NSString + LetterIndex.m

@implementation NSString (LetterIndex) 

- (NSString *)firstLetter 
{ 
    return self.length ? [self substringToIndex:1] : @""; 
} 

votre méthode:

- (NSArray *)indexLettersForStrings:(NSArray *)strings { 
    NSSet * distinctValues = [NSSet setWithArray:[strings valueForKey:@"firstLetter"]]; 
    return [[distinctValues allObjects] sortedArrayUsingSelector:@selector(compare:)] 
} 

aussi si vous avez des objets de classe personnalisée et que vous voulez groupez-les par les premières lettres de certains paramètres de chaîne, vous pouvez utiliser ceci:

NSSet * distinctValues = [NSSet setWithArray:[objects valueForKeyPath:@"myStringParam.firstLetter"]]; 
Questions connexes