我想用字典替换字符串中的一些字符,其他字符。
例如,每个“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!)
要明确一点:这段代码对我有用,我觉得它效率很低。我正在寻找改善它的方法。
谢谢。
答案 0 :(得分:3)
以下代码可能不会快得多,但稍微简单一些。 它枚举字符串的所有字符,其方法即使使用也能正常工作 组合字符,如Emojis(在字符串中存储为两个字符)。
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];
}
}];
答案 1 :(得分: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
你想要这个作为你想要的结果吗?
答案 2 :(得分: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代码来匹配你的确切规则。