web-dev-qa-db-ja.com

NSArray内のNSStringの先頭および末尾の空白を削除するにはどうすればよいですか?

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でのみ機能します。ちょっと混乱しました。助けてください...

40
shamsulfakhar

NSArrayおよび含まれるNSStringオブジェクトはすべて不変です。持っているオブジェクトを変更する方法はありません。

代わりに、新しい文字列を作成して、新しい配列に配置する必要があります。

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

読み取り http://nshipster.com/nscharacterset/

NSString -stringByTrimmingCharactersInSet:は、知っておくべきメソッドです。文字列入力の先頭と末尾の空白を削除するために、NSCharacterSet + whitespaceCharacterSetまたは+ whitespaceAndNewlineCharacterSetが最もよく渡されます。

したがって、Swift 3

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

SSToolkitには Niceカテゴリが2つあります があります: 編集:リンクが壊れていて、 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はあなたの友達です。

2
orkoden

ニコライは、可変性について正しいです。だから物事を解決するおそらく最も簡単な方法は定義することです

@property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode;

次に、文字列を1つずつ挿入します。

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

... "blah"を含む3つの要素を取得します。可変のNSMutableArrayにのみ、不変のNSArrayにObjectを追加することはできません。

もちろん、すでにどこかに余分なスペースのあるストリングが存在する場合があります。これらの文字列の可変(!)コピーを作成し、addObjectを使用してarrayRefineSubjectCode配列に追加する必要があります。配列にスペースを追加する前または後にスペースを削除できます。

それが少し役立つことを願っています。

最後の発言を追加すると考えました。とにかく不変オブジェクトを使用するのはなぜかと思うかもしれません。いくつかの理由がありますが、不変で逃げることができれば、コードが高速になり、コピーが簡単になります(データを保持するアドレスにポインターをコピーするだけです。データはとにかく変わらないためです)。スレッドセーフである可能性が高い。もちろん、NSMutableStringのような可変オブジェクトを指すNSArrayには注意してください!

1
markjs

「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;
}
1
zumzum

Noを変更し、yesをコピーして置き換えます:

- (void)test_stringByTrimming
{
    NSArray *arrayRefineSubjectCode = [NSArray arrayWithObjects:
                    @"  BKKC 2061",
                    @"   BKKS 2631   ",
                    @"BKKS 2381      ",
                    nil];
    NSMutableArray *trimmedStrings = [NSMutableArray arrayWithArray:arrayRefineSubjectCode];

    for (NSInteger i=0; i<trimmedStrings.count;i++) {
        [trimmedStrings setObject:[[arrayRefineSubjectCode objectAtIndex:i] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] atIndexedSubscript:i];
    }
    XCTAssertTrue([[trimmedStrings objectAtIndex:0] isEqualToString:@"BKKC 2061"]);
    XCTAssertTrue([[trimmedStrings objectAtIndex:1] isEqualToString:@"BKKS 2631"]);
    XCTAssertTrue([[trimmedStrings objectAtIndex:2] isEqualToString:@"BKKS 2381"]);

    XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:0] isEqualToString:@"  BKKC 2061"]);
    XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:1] isEqualToString:@"   BKKS 2631   "]);
    XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:2] isEqualToString:@"BKKS 2381      "]);
}
0
Elise van Looij