既存の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のバリエーションを使用できます。
非常に長い文字列の場合、unichars を unichar バッファーにコピーしてから、ac または c++ アプローチを使用して変換を実行し、文字を交換することで、多くの CPU 時間と割り当てを節約できます。UTF8String
は取得したいバッファーではなく、変更する必要もないことに注意してください。NSString
次に、シャッフルされたバッファーから新しいを作成 (または設定) します。
Fisher Yates アルゴと C および C++ 実装の詳細については、こちらを参照してください。