2

辞書を使用して、文字列内の一部の文字を他の文字に置き換えたいと思います。

たとえば、すべての "a" を "1" に置き換え、すべての "1" を "9" に置き換える必要があります。私が望んでいないのは、すべての「a」が2回置き換えられて「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

次のコードはおそらくそれほど高速ではありませんが、わずかに単純で短いものです。絵文字などの合成文字 (文字列に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];
       }
}];
于 2013-10-11T09:27:37.093 に答える
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 に答える