44 votes

Comment supprimer les espaces en tête et en queue de NSString dans un NSArray ?

J'ai un NSArray déclaré comme tel :

@property (nonatomic, strong) NSArray *arrayRefineSubjectCode;

J'ai rempli manuellement les éléments du tableau comme ci-dessous :

     arrayRefineSubjectCode = [NSArray arrayWithObjects:
                              @"  BKKC 2061",
                              @"   BKKS 2631   ",
                              @"BKKS 2381      ",
                              nil];

Alors comment puis-je supprimer les espaces de début et de fin et faire en sorte que chaque élément du tableau devienne comme ceci :

     arrayRefineSubjectCode = [NSArray arrayWithObjects:
                              @"BKKC 2061",
                              @"BKKS 2631",
                              @"BKKS 2381",
                              nil];

J'ai essayé d'utiliser "stringByTrimmingCharactersInSet :" mais cela ne fonctionne que pour NSString. Je suis un peu perdu. Aidez-moi, s'il vous plaît...

80voto

Nikolai Ruhe Points 45433

El NSArray et le contenu NSString sont tous immuables. Il n'y a aucun moyen de changer les objets que vous avez.

Au lieu de cela, vous devez créer de nouvelles chaînes de caractères et les placer dans un nouveau tableau :

NSMutableArray *trimmedStrings = [NSMutableArray array];
for (NSString *string in arrayRefineSubjectCode) {
    NSString *trimmedString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    [trimmedStrings addObject:trimmedString];
}
arrayRefineSubjectCode = trimmedStrings;

16voto

onmyway133 Points 2196

Lire http://nshipster.com/nscharacterset/

NSString -stringByTrimmingCharactersInSet : est une méthode que vous devriez connaître par cœur. On lui passe le plus souvent NSCharacterSet +whitespaceCharacterSet ou +whitespaceAndNewlineCharacterSet afin de supprimer les espaces en tête et en queue de chaîne.

Donc, dans Swift 3

let _ = " A B  C  ".trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) // A B  C

2voto

orkoden Points 2262

SSToolkit a quelques belles catégories pour ça : edit : le lien est cassé et il ne semble pas l'être dans SSToolkit plus .

C'est l'ancien code :

- (NSString *)stringByTrimmingLeadingAndTrailingCharactersInSet:(NSCharacterSet *)characterSet {
return [[self stringByTrimmingLeadingCharactersInSet:characterSet]
        stringByTrimmingTrailingCharactersInSet:characterSet];
}

- (NSString *)stringByTrimmingLeadingAndTrailingWhitespaceAndNewlineCharacters {
    return [[self stringByTrimmingLeadingWhitespaceAndNewlineCharacters]
            stringByTrimmingTrailingWhitespaceAndNewlineCharacters];
}

- (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet {
    NSRange rangeOfFirstWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]];
    if (rangeOfFirstWantedCharacter.location == NSNotFound) {
        return @"";
    }
    return [self substringFromIndex:rangeOfFirstWantedCharacter.location];
}

- (NSString *)stringByTrimmingLeadingWhitespaceAndNewlineCharacters {
    return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
    NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]
                                                               options:NSBackwardsSearch];
    if (rangeOfLastWantedCharacter.location == NSNotFound) {
        return @"";
    }
    return [self substringToIndex:rangeOfLastWantedCharacter.location + 1]; // Non-inclusive
}

- (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters {
    return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

Cependant, au lieu de supprimer plusieurs fois des jeux de caractères différents, il serait préférable de créer une union de tous les jeux de caractères que vous souhaitez supprimer. NSMutableCharacterSet est votre ami ici.

1voto

zumzum Points 865

Supprime les espaces blancs de tête et les espaces blancs de queue de la "chaîne".

- (NSString*)stringByRemovingLeadingAndTrailingWhiteSpaces:(NSString*)string {

    NSArray * components = [string componentsSeparatedByString:@" "];

    if([components count] == 1) {
        return string;
    }

    NSUInteger originalLength = [string length];
    unichar buffer[originalLength+1];
    [string getCharacters:buffer range:NSMakeRange(0, originalLength)];

    NSMutableString * newStringNoLeadingSpace = [NSMutableString string];
    BOOL goToStripTrailing = NO;
    for(int i = 0; i < originalLength; i++) {
        NSLog(@"%C", buffer[i]);
        NSString * newCharString = [NSString stringWithFormat:@"%c", buffer[i]];
        if(goToStripTrailing == NO && [newCharString isEqualToString:@" "]) continue;
        goToStripTrailing = YES;
        [newStringNoLeadingSpace appendString:newCharString];
    }

    NSUInteger newLength = [newStringNoLeadingSpace length];
    NSMutableString * newString = [NSMutableString string];
    unichar bufferSecondPass[newLength+1];
    [newStringNoLeadingSpace getCharacters:bufferSecondPass range:NSMakeRange(0, newLength)];

    int locationOfLastCharacter = (int)newLength;
    for(int i = (int)newLength - 1; i >= 0; i--) {
        NSLog(@"%C", bufferSecondPass[i]);
        NSString * newCharString = [NSString stringWithFormat:@"%c", bufferSecondPass[i]];
        locationOfLastCharacter = i+1;
        if(![newCharString isEqualToString:@" "]) break;
    }

    NSRange range = NSMakeRange(0, locationOfLastCharacter);

    newString = [[NSString stringWithString:[newStringNoLeadingSpace substringWithRange:range]] copy];

    return newString;
}

1voto

Carelinkz Points 896

Nikolaï a raison au sujet de la mutabilité. Donc, la manière la plus simple de résoudre les choses est de définir

@property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode;

puis insérez les chaînes une par une, par exemple

for ( int counter = 0 ; counter < 3 ; counter++ ) {
    NSMutableString *s = [NSMutableString stringWithFormat:@"   blah  "];
    [arrayRefineSubjectCode addObject:s];
    }

... pour obtenir trois éléments contenant " blah ". Notez que vous ne pouvez pas ajouter d'objet à un NSArray immuable, mais uniquement à un NSMutableArray mutable.

Bien sûr, il se peut que vous ayez déjà les chaînes avec des espaces superflus quelque part. Vous devrez faire une copie mutable ( !) de ces chaînes, et les ajouter au tableau arrayRefineSubjectCode avec addObject. Vous pouvez supprimer les espaces avant ou après les avoir ajoutés au tableau.

J'espère que cela vous aidera un peu.

Je voulais juste ajouter une dernière remarque. Vous pouvez vous demander pourquoi vous utiliseriez des objets immuables de toute façon. Il y a plusieurs raisons, mais si vous pouvez vous en sortir avec des objets immuables, le code est plus rapide, la copie est facile (il suffit de copier le pointeur vers l'adresse qui contient les données, parce que ces données ne changeront pas de toute façon), et il est plus probable qu'ils soient thread-safe. Bien sûr, il faut alors faire attention avec un NSArray qui pointe sur des objets mutables comme NSMutableString !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X