使用字典replace多个其他字符在NSString中的多个字符
我想用字典replacestring中的某些字符,用其他字符replace。
例如,每个“a”应该被replace为“1”,并且每个“1”应该被replace为“9”。 我不想要的是每个“一个”被replace两次,最后是一个“9”。 每个angular色必须被replace一次。
我使用下面的代码得到了这个工作,但我觉得它可以做得更有效率。 这真的是我能做的最好的,或者你能帮我改进我的代码吗?
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!)
只是要清楚:这个代码是为我工作,我只是觉得它是非常低效的。 我正在寻找方法来改善它。
谢谢。
下面的代码可能不会更快,但稍微简单一些。 它枚举string的所有字符与一个方法,即使与组成字符,如Emojis(它们被存储为string中的两个字符)正确的方法。
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]; } }];
首先用“9”replace每个“1”,然后用“1”replace每个“a”。 逻辑有什么问题?
你的字典是
@"1", @"a", @"2", @"b", @"3", @"c", @"9", @"1", @"8", @"2", @"7", @"3", nil
将“9”replace为“1”
@"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
你想把这个作为你想要的结果吗?
如果你的规则是静态的,就像你说的…我不确定是否更好
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码来匹配你的确切规则。