2012-01-25 108 views
3

有誰知道現有的方法來改變現有的NSString或NSMutableString的字符的順序?無論如何,我有一個解決方法,但如果有一個現有的方法,它會很好。快速混淆NSString的順序?

例如,給定字符串@「HORSE」,返回@「ORSEH」,@「SORHE」,@「ROHES」等的方法?

回答

5

考慮以下代碼:
.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秒。

用法:改編自另一種語言/僞

+0

如果您在10.7或iOS 4.3+上運行代碼,arc4random_uniform(maxIntIndex)是一個更好的隨機數生成器。儘管如果你需要支持任何舊的東西,arc4random()仍然不錯。 –

+1

啊,當我編譯爲10.5時,它沒有出現在「建​​議」菜單中。很高興知道。 –

+0

@ HiGuy'CouleeApps'Smith感謝您的評論,我有一個問題讓它工作,雖然:**語義問題:類方法'+ scrambleString:'找不到(返回類型默認爲'id')** 任何想法如何解決它?我已將它放在標題和實現文件中 –

3

可以使用Fisher-Yates Shuffle的Durstenfeld的變化

NSString *scrambled = [NSString scrambleString:otherString]; 

代碼。

對於非常長的字符串,可以通過將unichars複製到unichar緩衝區,然後使用c或C++方法來交換字符來節省大量CPU時間和分配。請注意,UTF8String不是您想要使用的緩衝區,也不應該改變它。然後從洗牌緩衝區創建(或設置)一個新的NSString

有關Fisher Yates算法和C和C++實現的更多信息can be found here