2

我想使用字典将字符串中的某些字符替换为其他字符。

例如,每个“a”应该被“1”替换,每个“1”应该被“9”替换。我不希望每个“a”都被替换两次,最后是“9”。每个字符只能替换一次。

我使用以下代码完成了这项工作,但我觉得它可以更有效地完成。这真的是我能做的最好的事情,还是你能帮我改进我的代码?

NSDictionary *replacements = [NSDictionary dictionaryWithObjectsAndKeys:
                              // Object, Key,
                              @"1", @"a",
                              @"2", @"b",
                              @"3", @"c",
                              @"9", @"1",
                              @"8", @"2",
                              @"7", @"3",
                              nil];

NSString *string = @"abc-123";
NSMutableString *newString = [NSMutableString stringWithCapacity:0];

for (NSInteger i = 0; i < string.length; i++)
{
    NSString *c = [NSString stringWithFormat:@"%C", [string characterAtIndex:i]];
    id replacement = [replacements objectForKey:c];
    if (replacement != nil) {
        [newString appendString:replacement];
    } else {
        [newString appendString:c];
    }
}

NSLog(@"newString: %@", newString); // newString: 123-987 (Works!)

只是要明确一点:这段代码对我有用,我只是觉得它效率很低。我正在寻找改进它的方法。

谢谢你。

4

3 回答 3

3

下面的代码可能不会快多少,但稍微简单一些并且更短。它使用一种即使使用组合字符(如表情符号)(在字符串中存储为两个字符)也能正常工作的方法枚举字符串的所有字符。

NSMutableString *newString = [string mutableCopy];

[newString enumerateSubstringsInRange:NSMakeRange(0, [newString length])
                  options:NSStringEnumerationByComposedCharacterSequences
               usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
       NSString *repl = replacements[substring];
       if (repl != nil) {
           [newString replaceCharactersInRange:substringRange withString:repl];
       }
}];
于 2013-10-11T09:27:37.093 回答
0

首先将每个“1”替换为“9”,然后将每个“a”替换为“1”。逻辑有什么问题?

你的字典是

@"1", @"a",
@"2", @"b",
@"3", @"c",
@"9", @"1",
@"8", @"2",
@"7", @"3",
nil

将“1”替换为“9”将创建

@"9", @"a",
@"2", @"b",
@"3", @"c",
@"9", @"9",
@"8", @"2",
@"7", @"3",
nil

然后用“1”替换“a”将创建

@"9", @"1",
@"2", @"b",
@"3", @"c",
@"9", @"9",
@"8", @"2",
@"7", @"3",
nil

你想要这个作为你想要的结果吗?

于 2013-10-11T09:08:34.980 回答
0

如果你的规则像你说的那样是静态的......我不确定它是否更好

NSString *string = @"abc-123";
NSMutableString *newString = [NSMutableString stringWithCapacity:0];

for (NSInteger i = 0; i < string.length; i++)
{

    unichar cu = [string characterAtIndex:i];
    if (cu >=97 && cu<=99){
        cu -= 48;
    }else if (cu>=49 && cu<=51){
        cu = cu+10-((cu-48)*2);
    }
    [newString appendString:[NSString stringWithFormat:@"%C",cu]];
}

NSLog(@"newString: %@", newString);

我正在使用 ASCII 代码来完全匹配您的规则。

于 2013-10-11T09:49:15.320 回答