有谁知道改变现有 NSString 或 NSMutableString 字符顺序的现有方法?无论如何,我有一个解决方法,但如果有一个现有的方法,那就太好了。
例如,给定字符串@"HORSE",返回@"ORSEH"、@"SORHE"、@"ROHES" 等的方法?
有谁知道改变现有 NSString 或 NSMutableString 字符顺序的现有方法?无论如何,我有一个解决方法,但如果有一个现有的方法,那就太好了。
例如,给定字符串@"HORSE",返回@"ORSEH"、@"SORHE"、@"ROHES" 等的方法?
考虑以下代码:
.h 文件:
@interface NSString (Scrambling)
+ (NSString *)scrambleString:(NSString *)toScramble;
@end
.m 文件:
@implementation NSString (Scrambling)
+ (NSString *)scrambleString:(NSString *)toScramble {
for (int i = 0; i < [toScramble length] * 15; i ++) {
int pos = arc4random() % [toScramble length];
int pos2 = arc4random() % ([toScramble length] - 1);
char ch = [toScramble characterAtIndex:pos];
NSString *before = [toScramble substringToIndex:pos];
NSString *after = [toScramble substringFromIndex:pos + 1];
NSString *temp = [before stringByAppendingString:after];
before = [temp substringToIndex:pos2];
after = [temp substringFromIndex:pos2];
toScramble = [before stringByAppendingFormat:@"%c%@", ch, after];
}
return toScramble;
}
@end
不是最漂亮的代码或执行,但可以完成工作。可能有一种 (const char *) 方法可以做到这一点,但这对我来说很好。快速测试显示在我的 Mac 上执行的长度为 0.001021 秒。
用法:
NSString *scrambled = [NSString scrambleString:otherString];
改编自另一种语言/伪代码的代码
您可以使用 Durstenfeld 的Fisher-Yates Shuffle变体。
对于非常长的字符串,您可以通过将 unichar 复制到 unichar 缓冲区,然后使用 ac 或 c++ 方法执行转换以交换字符来节省大量 CPU 时间和分配。请注意,这UTF8String
不是您要使用的缓冲区,也不应该对其进行变异。NSString
然后从洗牌缓冲区创建(或设置)一个新的。
有关 Fisher Yates 算法以及 C 和 C++ 实现的更多信息,请参见此处。