2012-01-25 3 views
3

既存のNSStringまたはNSMutableStringの文字の順序を変更する既存の方法を知っている人はいますか?とにかく回避策がありますが、既存の方法があれば素晴らしいことでしょう。素早くNSStringの順序を突き止めるには?

たとえば、@ "ORSEH"、@ "SORHE"、@ "ROHES"などを返すメソッド "HORSE"を指定すると、
.hファイル:

@interface NSString (Scrambling) 

+ (NSString *)scrambleString:(NSString *)toScramble; 

@end 

.mファイル:

答えて

5

このコードを考えてみましょう

@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'CouleeAppsSmithご意見ありがとうございます。私は問題を抱えています:**意味論問題:クラスメソッド '+ scrambleString:'が見つかりませんでした(戻り値のデフォルトは 'id')** どのように私はそれを修正することができますどのような考え?私はそれをヘッダと実装ファイルに入れました –

3

あなたはFisher-Yates ShuffleのDurstenfeldのバリエーションを使用することができますから適応

NSString *scrambled = [NSString scrambleString:otherString]; 

コード。

非常に長い文字列の場合、unicharsをunicharバッファにコピーし、cまたはC++の手法を使用して文字をスワップすることで、多くのCPU時間と割り当てを節約できます。 UTF8Stringは、取るべきバッファではなく、それを変更する必要があります。次に、シャッフルされたバッファから新しいNSStringを作成(または設定)します。

Fisher Yates algoとCおよびC++の実装の詳細can be found here

関連する問題