2013-08-07 2 views
3

У меня возникла проблема, когда мне нужно инвертировать два символа внутри строки. Например, если моя строка «a * b/c», и я хочу заменить вхождения * с помощью/и/с *. Я хочу, чтобы результирующая строка была «a/b * c».Заменить вхождения двух символов друг в друга в строке

Используя метод stringByReplacingOccurrenceOfString: не работает, потому что я не хочу, чтобы первый раунд замен, чтобы повлиять на второй:

string = @"a*b/c"; 
[string stringByReplacingOccurrencesOfString:@"*" withString:@"/"]; 
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"]; 

Это приводит к «а * Ь * С», который не то, что есть Я хочу. Кто-нибудь знает эффективный способ достижения этого?

ответ

4
string = @"a*b/c"; 
[string stringByReplacingOccurrencesOfString:@"*" withString:@"&"]; 
[string stringByReplacingOccurrencesOfString:@"/" withString:@"*"]; 
[string stringByReplacingOccurrencesOfString:@"&" withString:@"/"]; 
+2

Хм, славная попытка. Что, если у него есть другие символы '&' в этой строке в первую очередь? –

+0

Мне нравится это как решение, при котором нет необходимости использовать «&»/«другой произвольный символ» –

+0

Если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' как 'tHiS_sTrInG_wIlL_nEvEr_OcCuR_iN_mY_sTrInG' –

1

Используйте NSScanner для перемещения по строке и замены каждого символа так, как он найден. Таким образом, все замены выполняются за один проход, и вы никогда не смотрите на позицию дважды.

NSMutableString * fixedUpString = [NSMutableString string]; 
NSScanner * scanner = [NSScanner scannerWithString:origString]; 
NSCharacterSet * subCharacters = [NSCharacterSet characterSetWithCharactersInString:@"*/"]; 

while(![scanner isAtEnd]){ 

    // Pick up other characters. 
    NSString * collector; 
    if([scanner scanUpToCharactersInSet:subCharacters intoString:&collector]){ 
     [fixedUpString appendString:collector]; 
    } 

    // This can easily be generalized with a loop over a mapping from 
    // found characters to substitutions 
    // Check which one we found 
    if([scanner scanString:@"*" intoString:nil]){ 

     // Append the appropriate substitution. 
     [fixedUpString appendString:@"/"]; 
    } 
    else /* if([scanner scanString:@"/" intoString:nil]) */ { 
     [fixedUpString appendString:@"*"]; 
    } 
} 

fixedUpString теперь содержит замещенный содержание.

Как я отметил в комментарии, это может быть обобщена очень легко на любое количество замен:

NSDictionary * substitutions = @{ @"a" : @"z", @"b" : @"y", ... }; 
NSCharacterSet * keyChars = [NSCharacterSet characterSetWithCharactersInString:[[substitutions allKeys] componentsJoinedByString:@""]]; 

... 

// Check which one we found 
for(NSString * keyChar in [substitutions allKeys]){ 

    if([scanner scanString:keyChar intoString:nil){ 
     [fixedUpString appendString:substitutions[keyChar]]; 
     break; 
    } 
} 
1

я должен был иметь идти на это, не используя посредника & характер, и, хотя это, конечно, более запутанным, это также, кажется, работает:

int main(int argc, char *argv[]) 
{ 

    NSString *s = @"1*2/3*4*5*6*7*8/2"; 

    NSArray *stars = [s componentsSeparatedByString:@"*"]; 
    NSMutableArray *slashes = [NSMutableArray array]; 
    for (NSString *star in stars) 
    { 
     [slashes addObject:[star componentsSeparatedByString:@"/"]]; 
    } 

    NSMutableArray *newStars = [NSMutableArray array]; 
    for (NSArray *slash in slashes) 
    { 
     [newStars addObject:[slash componentsJoinedByString:@"*"]]; 
    } 

    NSString *newString = [newStars componentsJoinedByString:@"/"]; 

    NSLog(@"%@", newString); 

    return 0; 
} 

Выход:

1/2 * 3/4/5/6/7/8 * 2

0

Вот мое решение, так как я не мог найти встроенный метод, который бы делал то, что вы ищете.

NSString *string = @"a*b/c"; 
NSDictionary *swapings = @{@"*" : @"/", @"/" : @"*"}; 
NSString *newString = [self swap:swapings inString:string]; 
NSLog(@"'%@' became '%@'", string, newString); 

# ... somewhere in self : 

-(NSString *)swap:(NSDictionary *)swapings inString:(NSString *)string { 
    NSMutableArray *letters = [NSMutableArray array]; 
    for (int i = 0; i < [string length]; i++) { 
     NSString *letter = [string substringWithRange:NSMakeRange(i, 1)]; 
     [letters addObject:letter]; 
    } 

    for (int i=0; i<letters.count; i++) { 
     NSString *letter = [letters objectAtIndex:i]; 
     for(NSString *token in [swapings allKeys]) { 
      if ([letter isEqualToString:token]) { 
       letter = [swapings valueForKey:token]; 
       break; 
      } 
     } 
     [letters replaceObjectAtIndex:i withObject:letter]; 
    } 

    return [letters componentsJoinedByString:@""]; 
} 
Смежные вопросы