Подтвердить что ты не робот

Как удалить ведущие и конечные пробелы NSString внутри NSArray?

У меня есть NSArray, объявленный как таковой:

@property (nonatomic, strong) NSArray *arrayRefineSubjectCode;

У меня есть элементы массива, заполненные вручную, как показано ниже:

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

Итак, как удалить начальные и конечные пробелы и сделать каждый элемент массива следующим:

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

Я попытался использовать "stringByTrimmingCharactersInSet:", но он работает только для NSString. Чуда смутилась здесь. Пожалуйста, помогите...

4b9b3361

Ответ 1

Объекты NSArray и содержащиеся NSString объекты неизменяемы. Нет способа изменить объекты, которые у вас есть.

Вместо этого вам нужно создать новые строки и поместить их в новый массив:

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

Ответ 2

Прочитайте http://nshipster.com/nscharacterset/

NSString -stringByTrimmingCharactersInSet: метод, который вы должны знать наизусть. Он чаще всего проходил NSCharacterSet + whitespaceCharacterSet или + whitespaceAndNewlineCharacterSet, чтобы удалить начальное и конечное пробелы ввода строки.

Итак, в Swift 3

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

Ответ 3

SSToolkit имеет пару приятных категорий для этого: edit: ссылка сломана, и она не кажется для в SSToolkit больше.

Это старый код:

- (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]];
}

Однако вместо того, чтобы несколько раз удалять разные наборы символов, было бы лучше создать объединение всех наборов символов, которые вы хотите удалить. NSMutableCharacterSet твой друг.

Ответ 4

Удаляет ведущие белые пробелы и завершающие пробелы из "string"

- (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;
}

Ответ 5

Николай прав насчет изменчивости. Таким образом, возможно, самый простой способ решить проблему - определить

@property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode;

а затем вставлять строки один за другим, например

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

... чтобы получить три элемента с "бла" в нем. Обратите внимание: вы не можете addObject для неизменяемого NSArray, только для изменяемого NSMutableArray.

Конечно, у вас могут быть строки с лишними пространствами, которые уже где-то сидят. Вам нужно будет сделать изменяемую (!) Копию этих строк и добавить их в массив arrayRefineSubjectCode с помощью addObject. Вы можете удалить пробелы до или после добавления их в массив.

Надеюсь, что это поможет.

Просто подумал добавить последнее замечание. Вы можете задаться вопросом, почему вы все равно должны использовать неизменяемые объекты. Есть несколько причин, но если вы можете уйти с неизменным, они приведут к более быстрому коду, копирование будет простым (просто скопируйте указатель на адрес, содержащий данные, потому что эти данные не будут меняться в любом случае), и это более вероятно, будет потокобезопасным. Конечно, будьте осторожны с NSArray, который указывает на изменяемые объекты, такие как NSMutableString!

Ответ 6

 NSString *newString = [someString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];