2012-02-15 6 views
38

Ho un NSArray dichiarato come tale:Come rimuovo gli spazi bianchi iniziali e finali di NSString all'interno di un NSArray?

@property (nonatomic, strong) NSArray *arrayRefineSubjectCode; 

ho gli elementi dell'array riempiti manualmente come di seguito:

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

Allora, come faccio rimuovere inizio e fine gli spazi e rendere ogni elemento dell'array a divento come questi:

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

ho provato con "stringByTrimmingCharactersInSet:" ma funziona solo per NSString. Un po 'confuso qui. Per favore aiuto ...

+0

possibile duplicato di http://stackoverflow.com/q/758212/1114171 –

+1

Se è possibile, sarebbe molto meglio per tagliare il spazi bianchi prima di metterli nell'array per iniziare. –

+0

Ma quel post taglia gli spazi da NSString @ Tom Ingram. – shamsulfakhar

risposta

70

Il NSArray e gli oggetti NSString contenuti sono tutti immutabili. Non c'è modo di cambiare gli oggetti che hai.

Invece è necessario creare nuove stringhe e metterli in un nuovo array:

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

Cosa succede se dichiaro il mio array come un NSMutableArray, posso quindi modificare gli elementi dell'array? – shamsulfakhar

+2

È possibile * scambiarli * con altri oggetti. Non è possibile modificare (immutable) oggetti 'NSString'. –

+2

non sarà possibile modificare le stringhe al suo interno, poiché sono immutabili. Sarai solo in grado di modificare il contenuto dell'array ... non il contenuto delle stringhe al suo interno –

1

Nikolai ha ragione circa la mutevolezza. Quindi il modo più semplice per risolvere le cose è definire

@property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode; 

e quindi inserire stringhe una ad una, ad es.

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

... per ottenere tre elementi con "blah" in esso. Notare che non è possibile aggiungereOggetto a un NSArray immutabile, solo a un NSMutableArray mutabile.

Naturalmente, è possibile avere le corde con spazi superflui già seduti da qualche parte. Dovrai creare una copia mutabile (!) Di quelle stringhe e aggiungerle alla matrice arrayRefineSubjectCode con addObject. È possibile rimuovere gli spazi prima o dopo averli aggiunti all'array.

La speranza aiuta un po '.

Ho solo pensato di aggiungere un'ultima osservazione. Potresti chiederti perché useresti comunque oggetti immutabili. Ci sono alcuni motivi, ma se riesci a farla finita con immutabile, portano a un codice più veloce, la copia è facile (basta copiare il puntatore sull'indirizzo che contiene i dati, perché quei dati non cambieranno comunque), ed è più probabilità di essere thread-safe. Certo, fai attenzione quindi con un NSArray che punta su oggetti mutabili come NSMutableString!

+1

A proposito, il problema non è che la matrice sia immutabile (dopotutto, contiene solo dei puntatori agli oggetti NSString), il problema è che gli oggetti NSString sono immutabili. Quindi, se si dispone di un NSArray popolato con puntatori agli oggetti NSMutableString, non si avranno problemi. – markjs

+0

Prego. Per creare un array mutabile basta usare NSMutableArray, farà la maggior parte di ciò che fa NSArray (tutti?) E poi alcuni. Sono ancora un po 'curioso del perché tu costruisca un array come quello del tuo esempio, ma presumo che sia solo un breve pezzetto di codice per ottenere il risultato? – markjs

2

SSToolkit ha a couple of nice categories per questo: edit: collegamento è rotto e non sembra essere in SSToolkit anymore.

Questo è il vecchio codice:

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

Tuttavia, invece di strippaggio più volte con diversi set di caratteri, potrebbe essere meglio per creare un unione di tutti i set di caratteri che si desidera rimuovere. NSMutableCharacterSet è tuo amico lì.

1

Rimuove leader spazi bianchi e gli spazi finali bianchi da "string" http://nshipster.com/nscharacterset/

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

Perché pensi che questo è meglio di NSString di costruito nel 'stringByTrimmingCharactersInSet:'? –

+0

Cosa disse Nikolai. Inoltre, questo è orribilmente inefficiente, cioè lento. Inoltre, questa non è una risposta adatta alla domanda posta. –

13

Leggi

NSString -stringByTrimmingCharactersInSet: è un metodo che si deve sapere a memoria. Spesso viene passato NSCharacterSet + whitespaceCharacterSet o + whitespaceAndNewlineCharacterSet per rimuovere gli spazi iniziali iniziali e finali dell'input stringa.

Così, a Swift 3

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

Per le persone pigre come me: TheString = [TheString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; dovrebbe fare il trucco, mentre si modifica la stessa stringa. – Mesbah

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