Как удалить ведущие и конечные пробелы 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. Чуда смутилась здесь. Пожалуйста, помогите...
Ответы
Ответ 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]];