有誰知道現有的方法來改變現有的NSString或NSMutableString的字符的順序?無論如何,我有一個解決方法,但如果有一個現有的方法,它會很好。快速混淆NSString的順序?
例如,給定字符串@「HORSE」,返回@「ORSEH」,@「SORHE」,@「ROHES」等的方法?
有誰知道現有的方法來改變現有的NSString或NSMutableString的字符的順序?無論如何,我有一個解決方法,但如果有一個現有的方法,它會很好。快速混淆NSString的順序?
例如,給定字符串@「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秒。
用法:改編自另一種語言/僞
可以使用Fisher-Yates Shuffle的Durstenfeld的變化
NSString *scrambled = [NSString scrambleString:otherString];
代碼。
對於非常長的字符串,可以通過將unichars複製到unichar緩衝區,然後使用c或C++方法來交換字符來節省大量CPU時間和分配。請注意,UTF8String
不是您想要使用的緩衝區,也不應該改變它。然後從洗牌緩衝區創建(或設置)一個新的NSString
。
有關Fisher Yates算法和C和C++實現的更多信息can be found here。
如果您在10.7或iOS 4.3+上運行代碼,arc4random_uniform(maxIntIndex)是一個更好的隨機數生成器。儘管如果你需要支持任何舊的東西,arc4random()仍然不錯。 –
啊,當我編譯爲10.5時,它沒有出現在「建議」菜單中。很高興知道。 –
@ HiGuy'CouleeApps'Smith感謝您的評論,我有一個問題讓它工作,雖然:**語義問題:類方法'+ scrambleString:'找不到(返回類型默認爲'id')** 任何想法如何解決它?我已將它放在標題和實現文件中 –