【问题标题】:Replacing multiple characters in NSString by multiple other characters using a dictionary使用字典将 NSString 中的多个字符替换为多个其他字符
【发布时间】:2013-10-19 06:25:26
【问题描述】:

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

例如,每个“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!)

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

谢谢。

【问题讨论】:

  • 你只迭代一个。 可能还有很多其他逻辑,但其中大多数会使用迭代,而不是对每个字符进行迭代,我认为不可能有更好的办法。

标签: ios objective-c replace nsstring


【解决方案1】:

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

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 代码来完全匹配你的规则。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我真的很喜欢这个。感谢你的付出!如果没有更好的结果,我会接受这个作为答案。
    • @MartinR 这里的替代品是什么??
    • @Muju: replacements 是问题中定义的字典。
    【解决方案3】:

    首先将每个“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
    

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

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

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

    【讨论】:

    • 我想你误解了我的问题。我想操作的字符串是 abc-123。使用如上所示的字典,结果将是 123-987。这正是它应该做的。我只想知道如何改进我的代码,因为我觉得它现在的效率不是很高。
    • 好的。对不起,我误解了你的问题。
    • 没问题,我仍然感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多